【问题标题】:Delete Records Based on Query Output根据查询输出删除记录
【发布时间】:2022-01-20 15:39:58
【问题描述】:

我有一张桌子,THEKITCHEN 有一个查询:

SELECT FOOD, COUNT(FOOD) 
FROM THEKITCHEN 
GROUP BY FOOD

这将返回以下输出:

FOIEGRAS    1
APPLEPIE    1
SORBET      1
FILETMIGNON 1
BRANZINO    5
TRUFFLES    2
ESCARGO     1
POULET      2

我接下来要做的是使用以下内容删除项目:

DELETE FROM THEKITCHEN 
WHERE FOOD IN ('FOIEGRAS')

现在这可行,但有时我需要删除该列中的所有项目/记录。并且运行 DELETE 语句 15-40 次变得很烦人。

是否可以将初始查询的输出放入一个变量中,然后对该变量使用DELETE 语句来删除所有项目?我试过了

UPDATE THEKITCHEN 
SET FOOD = NULL;

但错误在于我的表不允许 Null。

谢谢!


更新:THEKITCHEN 有其他列,我不想从中删除记录。所以 TRUNCATE TABLE THEKITCHEN 会丢失很多重要的东西。


更新:是的,TRUNCATE TABLE THEKITCHEN 是要走的路!

【问题讨论】:

  • 如果您想删除所有项,无论它们是什么,简单的DELETE THEKITCHENTRUNCATE TABLE THEKITCHEN 就足够了,无需先查询它们。如果您只是想删除多个项,您可以使用WHERE FOOD IN ('FOIEGRAS', 'APPLEPIE', 'SORBET')。如果您想根据特定查询进行删除,请使用DELETE ... FROM 或CTE (WITH BADKITCHEN AS (SELECT ... FROM THEKITCHEN) DELETE BADKITCHEN),但具体情况不在您的问题范围内。
  • 您的问题有点令人困惑,因为您指的是删除 column - 您删除了 rows
  • True.. 感谢您指出这一点。我的意思是一列中的所有行。 @Stu
  • @vicscul 不,你的意思是 table 中的所有行
  • 一张表由行(垂直的东西)组成,每一行都包含列(水平的东西)。您只能删除行;列不能单独删除。您可以从表中删除 列,但随后它将从所有行中消失。您可以将列设置为NULL(就像您所做的那样),但如果该列不允许NULL,那将不起作用。我建议你仔细重新考虑你真正追求的是什么——如果必须的话,用你的餐桌前后来描述它。

标签: sql-server


【解决方案1】:

如果你想删除所有的食物,你根本不需要条件,只需使用delete from thekitchen。此外,您可以使用 DDL 语句truncate table thekitchen,这样会更快。

【讨论】:

  • 经过大量阅读和理解 DELETE 语句的作用,是的,TRUNCATE TABLE THEKITCHEN 是要走的路
  • @vicscul 如果此答案解决了您的问题,请“接受”它。
猜你喜欢
  • 1970-01-01
  • 2021-06-03
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2013-09-14
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多