从多列子查询中删除

时间:2019-08-09 03:42:16

标签: sql subquery

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

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

这是子查询:

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。

有人可以帮我解决这个问题吗?我已经尝试了所有变化,但似乎无济于事。

3 个答案:

答案 0 :(得分: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])

我会选择第一个,因为经过充分测试后,如果您删除不需要的内容就可以了(将它们分开将始终删除)。

希望有帮助。

答案 1 :(得分:0)

从反式删除      在哪里id_col(      SELECT TOP(100)PER.t_id_col      从反式全外联      temp_lease AS l t.dept_no = l.dept_no AND t.unit = l.unit AND t.lease_star = l.lease_start_date     在哪里(l.dept_no IS NULL)     订单由t.dept_no,t.unit,t.lease_star)内部查询

-内部查询-运行速度更快

 DELETE FROM trans 
 WHERE id_col in([ID_LIST_FROM_1st_QUERY])

希望有帮助。

答案 2 :(得分:0)

根据您的描述,我将使用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 join中,delete基本上是没有用的。您需要第一个表中的一条记录才能删除它。因此,left join就足够了。

此外,当两个列均为NULL时,以上内容也不认为两列匹配。如果存在问题,则可以调整相关子句以处理NULL值。