【问题标题】:DELETE FROM subquery with multiple columnsDELETE FROM 具有多列的子查询
【发布时间】:2019-08-09 03:42:16
【问题描述】:

我需要了解如何根据子查询删除记录。

我尝试了很多东西并在这里搜索以免重复问题,但找不到答案。

这是子查询:

SELECT TOP (100) PERCENT t.id_col, t.dept_no, t.unit, t.lease_star
 FROM trans AS t FULL OUTER JOIN
 temp_lease AS l ON t.dept_no = l.dept_no AND t.unit = l.unit AND t.lease_star = l.lease_start_date 
WHERE (l.dept_no IS NULL)
ORDER BY t.dept_no, t.unit, t.lease_star

子查询在 trans 文件中查找不具有 dept_no、unit 和 Lease_start_date 的匹配组合的记录(这两个文件的最后一个字段具有不同的名称,因为 VFP 将字段名称截断为 10 - 并且它们升迁了VFP 文件)。

找到这些记录(确实如此)后,我希望能够删除 temp_lease 表中没有三重匹配的记录。

首先,我想使用 SELECT 而不是 DELETE,因为我总是学会在确定代码正确后才使用 DELETE。

谁能帮我解决这个问题?我已经尝试了所有变体,似乎没有任何效果。

【问题讨论】:

  • WITH list as (SELECT TOP (100) PERCENT....) DELETE FROM table WHERE ID IN (SELECT ID FROM list)
  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tag

标签: sql subquery


【解决方案1】:

你可以这样做:

 DELETE FROM trans
 WHERE id_col in(
 SELECT TOP (100) PERCENT t.id_col
 FROM trans AS t FULL OUTER JOIN
 temp_lease AS l ON t.dept_no = l.dept_no AND t.unit = l.unit AND t.lease_star = l.lease_start_date 
WHERE (l.dept_no IS NULL)
ORDER BY t.dept_no, t.unit, t.lease_star) innerquery

如果您坚持执行 SELECT FIRST,您可以先运行内部查询,然后再执行此操作:

 DELETE FROM trans 
 WHERE id_col in([ID_LIST_FROM_1st_QUERY])

我会选择第一个,因为在你测试足够之后,如果你删除你不需要的东西就可以了(并且将它们分开也会删除)。

希望对您有所帮助。

【讨论】:

  • 谢谢,做得很完美!
【解决方案2】:

从翻译中删除 WHERE id_col in( SELECT TOP (100) PERCENT t.id_col FROM trans AS t FULL OUTER JOIN temp_lease AS l ON t.dept_no = l.dept_no AND t.unit = l.unit AND t.lease_star = l.lease_start_date WHERE(l.dept_no 为空) ORDER BY t.dept_no, t.unit, t.lease_star) 内部查询

--内部查询 - 它运行得更快

 DELETE FROM trans 
 WHERE id_col in([ID_LIST_FROM_1st_QUERY])

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    根据您的描述,我会使用not exists。获取要删除的行:

    SELECT t.*
    FROM trans t 
    WHERE NOT EXISTS (SELECT 1
                      FROM temp_lease l 
                      WHERE t.dept_no = l.dept_no AND
                            t.unit = l.unit AND 
                            t.lease_start = l.lease_start_date 
                     );
    

    删除记录只需要调整查询:

    DELETE t
    FROM trans t 
    WHERE NOT EXISTS (SELECT 1
                      FROM temp_lease l 
                      WHERE t.dept_no = l.dept_no AND
                            t.unit = l.unit AND 
                            t.lease_start = l.lease_start_date 
                     );
    

    full joindelete 中基本上没有用处。您需要第一个表中的记录才能删除它。因此,left join 就足够了。

    另外,当两列都是NULL 时,上面不考虑匹配两列。如果这是一个问题,您可以调整相关子句以处理 NULL 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多