PostgreSQL удалить дублирующиеся строки с внутренним соединением - PullRequest
0 голосов
/ 15 марта 2020
DELETE c1 FROM component c1 INNER JOIN component c2 WHERE c1.id > c2.id AND c1.key = c2.key;

я получаю следующую ошибку

ERROR:  syntax error at or near "c1"
LINE 1: DELETE c1 FROM component c1 INNER JOIN component c2 WHERE c1...

в чем проблема с моим запросом?

Ответы [ 4 ]

2 голосов
/ 15 марта 2020

Нельзя использовать синтаксис JOIN для присоединения к таблице, из которой удаляется. Правильный синтаксис - использовать USING вместо:

DELETE FROM component c1 
USING component c2 
WHERE c1.id > c2.id AND c1.key = c2.key;

Это означает, что вы должны поместить условие соединения в предложение WHERE, а не в ON, но вы уже это делали.

0 голосов
/ 15 марта 2020

Удалить c1 из вашего запроса:

DELETE FROM component c1 
    INNER JOIN component c2 
    WHERE c1.id > c2.id 
    AND c1.key = c2.key
0 голосов
/ 15 марта 2020

Это очень просто с EXISTS:

DELETE FROM component c 
WHERE EXISTS (SELECT 1 FROM component WHERE key = c.key and id < c.id)
0 голосов
/ 15 марта 2020

Предполагая, что id уникален, я бы сказал это в Postgres как:

DELETE component c USING
       (SELECT c2.*,
                 ROW_NUMBER() OVER (PARTITION BY key ORDER BY id) as seqnum
        FROM component c2
       ) c2
    WHERE c2.id = c.id AND c2.seqnum > 1;

Или используя коррелированный подзапрос:

DELETE component c
    WHERE c.id > (SELECT MIN(c2.id)
                  FROM component c2
                  WHERE c2.key = c.key
                 );

Ваша версия (которая использует SQL Синтаксис сервера) может найти несколько совпадений для каждой удаляемой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...