Удаление строк старше, чем строки в другой таблице с таким же идентификатором - PullRequest
0 голосов
/ 11 июня 2019

У меня есть две таблицы, скажем, X и Y, они имеют одинаковую структуру.

X:

+----------+----+-------+
| date     | id | value |
+----------+----+-------+
| 1.1.2019 | 1  | 1     |
| 1.1.2019 | 2  | 1     |
| 1.3.2019 | 3  | 1     |
+----------+----+-------+

Y

+----------+----+-------+
| date     | id | value |
+----------+----+-------+
| 1.2.2019 | 1  | 1     |
| 1.3.2019 | 2  | 1     |
+----------+----+-------+

Я хочу удалить все строки из таблицы X, которые имеют те же идентификаторы, что и в таблице Y, но имеют более старую дату, поэтому желаемый результат будет выглядеть так:

+----------+----+-------+
| date     | id | value |
+----------+----+-------+
| 1.3.2019 | 3  | 1     |
+----------+----+-------+

к сожалению, ни один из моих кодов не работает: /

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Вы можете использовать join в delete:

delete x
    from x join
         y
         on x.id = y.id and x.date < y.date;

Если вы просто хотите выбрать такие строки (что, на мой взгляд, безопаснее):

select x.*
from x join
     y
     on x.id = y.id and x.date < y.date;

Приведенное выше делает весьма разумное предположение, что date хранится в формате даты / времени, а не в виде строки.

Если ваш столбец «date» хранится в виде строки, вам следует исправить данные. Сначала преобразуйте формат в формат по умолчанию в вашей системе:

update x
    set x.date = str_to_date(x.date, <whatever the format is here>);

Формат даты неоднозначен - я не знаю, какой день, а какой месяц.

Затем преобразовать столбец в дату:

alter table t
    modify column date date;
0 голосов
/ 11 июня 2019

Вы можете использовать левое соединение, чтобы отфильтровать таблицу X и удалить строку.

DELETE X
FROM x X
LEFT JOIN y Y ON X.id = Y.id
WHERE Y.id IS NOT NULL
    AND Y.DATE > X.DATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...