删除postgresql

时间:2016-02-29 08:02:47

标签: sql postgresql

我有一个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子句条目

我该怎么做?

2 个答案:

答案 0 :(得分:1)

vm.editedItem您需要JOIN条款:

USING

答案 1 :(得分:1)

DELETE语句中加入表的语法与updateselect语句中的语法不同。您需要使用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);