Sql 从具有多列的子查询中删除

Sql 从具有多列的子查询中删除,sql,subquery,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_

我需要了解如何基于子查询删除记录

为了避免重复这个问题,我在这里做了很多尝试,但是找不到答案

下面是子查询:

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文件升迁

找到这些记录后,我希望能够删除临时租约表中没有三重匹配的记录

首先,我希望选择而不是删除,因为我一直都知道,只有在确保代码正确后,才使用删除


有人能帮我解决这个问题吗?我尝试了所有的变化,但似乎没有任何效果。

您可以这样做:

 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
如果坚持先选择,可以先运行内部查询,然后再执行以下操作:

 DELETE FROM trans 
 WHERE id_col in([ID_LIST_FROM_1st_QUERY])
不过我还是同意第一种方法,因为在你做了足够的测试之后,如果你删除了你不需要的东西,并且把它们分开,不管怎样都会删除

希望能有帮助

从trans中删除 你在哪里 选择顶部100%t.id\U列 从trans AS t完全外部连接 在t.dept\u编号=l.dept\u编号和t.unit=l.unit和t.lease\u star=l.lease\u开始日期,临时租赁为l 其中l.dept\u no为空 按t.dept\u编号、t.unit、t.lease\u星号查询的订单

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

 DELETE FROM trans 
 WHERE id_col in([ID_LIST_FROM_1st_QUERY])

希望能有帮助

根据您的描述,我将使用“不存在”。要获取要删除的行,请执行以下操作:

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 
                 );
完全联接在删除中基本上永远不会有用。第一个表中需要一条记录才能删除它。因此,左连接就足够了


此外,当两个列都为空时,上述两个列不匹配。如果这是一个问题,您可以调整correlation子句来处理空值。

将list作为SELECT TOP 100%。。。。从“从列表中选择ID”中ID所在的表中删除您正在使用的产品?SQL只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加一个链接,这样做非常完美!