2013-06-27 5 views
0

Я создал относительно простой запрос в MySQL, чтобы дать мне JOIN на трех таблицах, основанных на именах, которые совпадают с именами и фамилиями. Оттуда я хотел написать еще один запрос, который бы только показал мне записи, что не получить соответствие с JOIN - но я не мог понять, как это сделать. Я предполагаю, что это связано с использованием подзапроса с участием чего-то вроде NOT IN и моего исходного запроса, но я не мог заставить его дать мне результаты, которые я хотел.Подзапрос, который показывает записи только там, где JOIN не работает

Это обходным я пытался придумать, что частично функционировала должным образом:

SELECT *, 
    if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match") AS "t2 Match", 
    if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match") AS "t3 Match" 
FROM t1 
LEFT JOIN t2 ON t2.first=t1.first AND t2.last=t1.last 
LEFT JOIN t3 ON t3.first=t1.first AND t3.last=t1.last 
WHERE if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match")="No Match" 
    OR if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match")="No Match"; 

Я чувствую, что это то, что это довольно простой и прямой вперед, но я не получаю правильный Результаты. Может ли кто-нибудь помочь?

Спасибо!

ответ

5

Нет совпадений, что столбцы t2 (или t3) заполнены нулями в результатах. Таким образом, вы можете использовать IS NULL проверки:

SELECT t1.* 
FROM t1 
    LEFT JOIN t2 ON t2.first = t1.first AND t2.last = t1.last 
    LEFT JOIN t3 ON t3.first = t1.first AND t3.last = t1.last 
WHERE t2.first IS NULL 
    OR t3.first IS NULL ; 

И вы были правы, вы можете также писать запросы, используя NOT IN (предупреждение:. Только если соединительные колонки не NULLABLE В противном случае вы можете иметь неожиданные результаты):

SELECT t1.* 
FROM t1 
WHERE (first, last) NOT IN 
     (SELECT first, last FROM t2) 
    OR (first, last) NOT IN 
     (SELECT first, last FROM t3) 
    ; 

или с помощью NOT EXISTS:

SELECT t1.* 
FROM t1 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM t2 
     WHERE t1.first = t2.first 
      AND t1.last = t2.last 
    ) 
    OR NOT EXISTS 
     (SELECT 1 
     FROM t3 
     WHERE t1.first = t3.first 
      AND t1.last = t3.last 
    ) ; 
+0

Подобно тому, как легко, как я ожидал! Но я как-то пропустил это. Благодаря! – Ryan

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