Как найти пары, у которых нет пары в обратном порядке в таблице? - PullRequest
0 голосов
/ 03 февраля 2019

Есть две таблицы.

Friend, attrbutes ID1, ID2, описывающий ID1 и ID2, являются друзьями (если ID1 является другом для ID2, то ID2 является другом для ID1);

Likes, атрибуты ID1, ID2, описывающие ID1, лайки ID2 (ID1 лайки ID2 не обязательно означают ID2 лайки ID1).

Меня попросили удалить кортежи Likes для такой ситуации, что два ученика A и B являются друзьями, а A любит B, но не наоборот.Вот мой запрос, но он не удалил никаких кортежей:

delete from Likes where exists (
    select ID1,ID2 from Friend 
    where exists (select ID1,ID2 from Likes) 
    and not exists (select ID2,ID1 from Likes));

1 Ответ

0 голосов
/ 03 февраля 2019

Вы на правильном пути.Подход, приведенный ниже, заключается в использовании положительного предложения EXISTS, чтобы проверить, что данная подобная пара также имеет отношения друзей.Затем он использует отрицательное предложение NOT EXISTS, чтобы также утверждать, что взаимное подобное отношение не существует в таблице Likes для этого кортежа.

DELETE
FROM Likes l1
WHERE
    EXISTS (SELECT 1 FROM Friend f WHERE MIN(f.ID1, f.ID2) = MIN(l1.ID1, l1.ID2) AND
                                          MAX(f.ID1, f.ID2) = MAX(l1.ID1, l1.ID2)) AND
    NOT EXISTS (SELECT 1 FROM Likes l2 WHERE l1.ID1 = l2.ID2 AND l1.ID2 = l2.ID1);

Обратите внимание, что в первом предложении EXISTS Iиспользовать скалярные функции SQLite MIN и MAX.В этом случае мы не обязательно знаем, в каком порядке могут быть заданные отношения с друзьями или подобные отношения.Таким образом, мы можем сравнить меньшее и большее из двух значений ID с обеих сторон.

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