我有一个log
表格如下:
id status1 status2 ref dateofchange
1 10 12 33 1.1.10
2 10 12 34 1.1.15
3 5 8 14 1.5.10
4 10 12 33 2.1.10
和另一个表tab
如下:
id ref qty commitdate
1 17 5 1.1.10
2 33 8 1.1.10
3 34 7 1.12.14
4 34 8 1.2.16
5 34 8 1.1.15
我有一个查询,它给我log
表中的行:
select *
from log
where status1=10 and status2=12
这给出了:
id status1 status2 ref dateofchange
1 10 12 33 1.1.10
2 10 12 34 1.1.15
4 10 12 33 2.1.10
对于这些行中的每一行,我想从选项卡log.ref=tab.ref and tab.commitdate<=log.dateofchange
选项卡应如下所示:
id ref qty commitdate
1 17 5 1.1.10
4 34 8 1.2.16
我尝试使用WITH查询:
With l as (
select *
from log
where status1=10 and status2=12
)
delete from tab where l.ref=tab.ref and tab.commitdate<=l.dateofchange
然而这不起作用。
错误:缺少表“l”的FROM子句条目
我该怎么做?
答案 0 :(得分:1)
为vm.editedItem
您需要JOIN
条款:
USING
答案 1 :(得分:1)
在DELETE
语句中加入表的语法与update
或select
语句中的语法不同。您需要使用USING
才能加入delete
语句
with l as (
select *
from log
where status1=10 and status2=12
)
delete from tab
using l
where l.ref=tab.ref
and tab.commitdate <= l.dateofchange;
或没有CTE:
delete from tab
using log l
where l.ref = tab.ref
and l.status1 = 10
and l.status2 = 12
and tab.commitdate <= l.dateofchange;
使用共同相关的子查询时,也可以在没有连接的情况下编写:
delete from tab
where exists (select *
from log as l
where l.status1 = 10
and l.status2 = 12
and tab.commitdate <= l.dateofchange);