我需要了解如何根据子查询删除记录。
我尝试了很多事情,并在这里进行搜索,以免重复问题,但找不到答案。
这是子查询:
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。
有人可以帮我解决这个问题吗?我已经尝试了所有变化,但似乎无济于事。
答案 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
值。