从 PC table 中删除具有最小硬盘大小或最小内存大小的计算机
Delete from PC table the computers having minimal hdd size or minimal ram size
PC(代码、型号、速度、ram、hd、cd、价格)
我正在编写查询
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
有人可以纠正我的查询吗?
您的 EXISTS 只会删除 table 中 EXISTS 条件为真的任何内容。您可以了解更多 here.
您只需要删除指向 window 函数的记录。您可以了解更多信息 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;
您需要关联子句。否则,您将删除所有行(如果子查询 returns 有任何行)或没有行(如果子查询 returns 没有行)。
让您感到困惑的是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
);
PC(代码、型号、速度、ram、hd、cd、价格)
我正在编写查询
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
有人可以纠正我的查询吗?
您的 EXISTS 只会删除 table 中 EXISTS 条件为真的任何内容。您可以了解更多 here.
您只需要删除指向 window 函数的记录。您可以了解更多信息 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;
您需要关联子句。否则,您将删除所有行(如果子查询 returns 有任何行)或没有行(如果子查询 returns 没有行)。
让您感到困惑的是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
);