2016-02-29 2 views
0

У меня есть log таблицу следующим образом:удалять строки в PostgreSQL

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 

Однако это не работает.

ERROR: missing FROM-clause entry for table "l"

Как я могу это сделать?

ответ

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; 

или без КТР:

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); 
+0

Я не понимаю связанный с ним подзапрос. Я не хочу удалять все из вкладки ... Я хочу удалить только строки, где ссылка совпадает с датой, чем дата, записанная в таблице журналов. – java

+0

@java: это оператор 'exist' в предложении' where'. Оператор не удаляет все строки в 'tab' - только те, где существует строка в подзапросе (отсюда и название). –

+0

Но как он проверяет даты? даты не обязательно совпадают. – java

1

Для JOIN вам нужен USING пункт:

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;