我正在尝试检查是否有更好的解决这个查询问题:
查找具有相同速度和RAM的PC型号对。
结果,每个结果对只显示一次,即(i, j)而不是(j, i)。结果集:数值较高的模型,数值较低的模型,速度和RAM
我想出了:
select max(model), min(model), speed, ram
from PC
group by speed, ram
having count(model) = 2 and max(model) <> min(model)
和
speed ram
--------------------------------
1260 1232 500 32
1233 1232 500 64
1233 1121 750 128
PC表是这样的:
model speed ram
------------------------
1232 500 64
1121 750 128
1233 500 64
1121 600 128
1121 600 128
1233 750 128
1232 500 32
1232 450 64
1232 450 32
1260 500 32
1233 900 128
1233 800 128
改进的索引和适当的键(当然,还有编写良好的查询)是实现更好性能的最佳方法。请看下面的内容。
以下基于SQL server的SQL Fiddle示例突出显示了下面列出的代码。当然,可以针对其他dbms修改此示例。// Your table's columns were not detailed, so this example uses [int] datatype
CREATE TABLE [PCs] (
[id] int NOT NULL IDENTITY(1,1) PRIMARY KEY,
[model] int NOT NULL,
[speed] int NOT NULL,
[ram] int NOT NULL
);
INSERT INTO [PCs]
VALUES (1232, 500, 64),
(1121, 750, 128),
(1233, 500, 64),
(1121, 600, 128),
(1121, 600, 128),
(1233, 750, 128),
(1232, 500, 32),
(1232, 450, 64),
(1232, 450, 32),
(1260, 500, 32),
(1233, 900, 128),
(1233, 800, 128);
根据生成的PCs
表,下面的SQL语句返回共享speed
和ram
的所有计算机(成对,无论是单对还是多对):
SELECT [PCs].*
FROM [PCs]
INNER JOIN (
SELECT [speed], [ram]
FROM [PCs]
GROUP BY [speed], [ram]
HAVING COUNT(*) % 2 = 0
) AS dt ON ([PCs].[speed] = dt.[speed]
AND [PCs].[ram] = dt.[ram])
ORDER BY [PCs].[speed] ASC,
[PCs].[ram] ASC,
[PCs].[model] ASC;
为了提高性能,我建议在speed
和ram
列上添加INDEX
CREATE NONCLUSTERED INDEX [IX_PCs_speed_ram] ON [PCs] ([speed], [ram]);
我希望这个例子能帮助你找到你需要的解决方案。好运。