2013-12-17 5 views
0

Таблица 1 содержит уникальный столбец идентификатора с миллионами строк.MySQL: выберите несоответствующие строки в соединении

Таблица 2 содержит 2 столбца, matchId1, matchId2, которые могут содержать идентификатор из таблицы 1. В таблице 2 может быть много строк, ссылающихся на заданный идентификатор.

Как я могу перечислить идентификаторы из Таблицы 1, которые не содержатся в таблице 2 (в любом столбце) эффективным образом?

+0

[НЕ против НЕ СУЩЕСТВУЕТ против LEFT JOIN/IS NULL MySQL] (http://explainextended.com/2009/09/18/not -in-vs-not-exist-vs-left-join-is-null-mysql /) – valex

+0

@valex: Это хорошо, но как применить его к двум столбцам? Мне нужно удалить все строки, которые имеют либо matchid1, либо matchid2. Присоединение к matchid1 будет игнорировать matchid2. – Aki

ответ

1

Попробуйте это:

SELECT table1.* 
FROM table1 
LEFT JOIN Table2 on table1.id in (table2.matchId1,table2.matchId2) 
WHERE table2.matchId1 IS NULL AND table2.matchId2 IS NULL 
+0

С точки зрения этого он делает то, что я имею в виду и легко понять. благодаря – Aki

4
SELECT x.* 
    FROM table1 x 
    LEFT 
    JOIN table2 y 
    ON y.id = x.id 
WHERE y.id IS NULL; 

или, более конкретно ...

SELECT x.* 
    FROM table1 x 
    LEFT 
    JOIN table2 y 
    ON x.id IN(y.id1,y.id2) 
WHERE y.id IS NULL; 

Это предполагает, что есть один PK столбец table2

+0

Я как-то искал что-то похожее вчера и не нашел много. Наткнулся на это сегодня, потрясающе. Привет всем. –

+0

ОК, но это самый простой вопрос в RDBMS-land, так что не заходите за борт! ;-) – Strawberry

+0

Сонеон смеется. – Strawberry

2

Пару предложений

Использование Jons

SELECT x.* 
FROM table1 x 
LEFT JOIN table2 y ON y.matchId1 = x.id 
LEFT JOIN table2 z ON z.matchId2 = x.id 
WHERE y.matchId1 IS NULL AND z.matchId2 IS NULL 

U петь в

SELECT x.* 
FROM table1 x 
WHERE x.id NOT IN 
(
    SELECT matchId1 FROM table2 
    UNION 
    SELECT matchId2 FROM table2 
) 
+0

Какой, по вашему мнению, самый быстрый? У меня были сомнения, что первый будет работать для моего случая, так как я не знал, будут ли обычные строки из объединений интерпретироваться как одна строка. Кстати, у вас есть опечатка «jons» вместо «joins»). – Aki

+1

Я подозреваю, что первый запрос более эффективен, поскольку я подозреваю, что MySQL будет пытаться использовать любые индексы на matchid1/matchid2 во втором запросе. – Kickstart

Смежные вопросы