PC(代码,型号,速度,内存,高清,光盘,价格)
我正在编写查询
delete from PC
where exists
(select model , min(hd), min(ram) from PC
group by model)
但没有得到正确的结果
预期结果是
code model speed ram hd cd price
2 1121 750 128 14.0 40x 850.0000
4 1121 600 128 14.0 40x 850.0000
5 1121 600 128 8.0 40x 850.0000
6 1233 750 128 20.0 50x 950.0000
8 1232 450 64 8.0 24x 350.0000
11 1233 900 128 40.0 40x 980.0000
有人可以纠正我的查询吗?
答案 0 :(得分:2)
您的EXISTS只会从EXISTS条件为true的表中删除任何内容。您可以找到更多的here。
您只需要删除要删除的记录,它指向一个窗口函数。您可以找到更多信息here。
如果您只是想删除HD和RAM最低的记录,则以下内容将为您提供帮助。当心以下内容将首先按hd排序,然后按ram排序。因此,HD最小的记录将始终被首先删除。
BEGIN TRAN;
DELETE p FROM PC p
INNER JOIN
(
SELECT Code,
ROW_NUMBER() OVER (PARTITION BY model ORDER BY hd DESC, ram DESC) [RNum]
) m ON m.Code = p.Code AND m.RNum = 1;
--COMMIT TRAN;
--ROLLBACK TRAN;
答案 1 :(得分:1)
您需要一个关联子句。否则,您将删除所有行(如果子查询返回任何行)或不删除任何行(如果子查询不返回任何行)。
让您感到困惑的是group by
。您需要一个相关子句。我将其写为两个不同的比较:
delete from PC
where hd = (select min(hd)
from PC pc2
where pc2.model = pc.model
) or
ram = (select min(ram)
from PC pc2
where pc2.model = pc.model
);