从PC表中删除硬盘大小最小或内存最小的计算机

时间:2018-11-27 05:41:39

标签: sql sql-delete

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

有人可以纠正我的查询吗?

2 个答案:

答案 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
            );