我正在尝试检查此查询问题是否有更好的解决方案:
找到具有相同速度和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
答案 0 :(得分:0)
改进的索引和正确的密钥(当然,还有一个编写良好的查询)是实现更好性能的最佳方法。看看以下内容。
[以下基于SQL Server的SQL Fiddle example突出显示下面列出的代码。当然,可以为其他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
的所有计算机(成对,无论是一对还是多对): / p>
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]);
我希望这个例子可以帮助您找到所需的解决方案。祝你好运。