2015-03-03 6 views
0

Доброе утро,LEFT OUTER JOIN не работает

Я участвую в учебном туре по SQL и пытаюсь создать небольшую базу данных с несколькими запросами, чтобы получить опыт. Две базы данных, где используются, Person {id, name, age} и Knows {id, guest1_id → Лица, guest2_id → Лица}

Запрос должен содержать список имен людей, которые не знают никого из базы данных , но могут быть известны другим. Ниже приведен код, который я получил до сих пор, но он, похоже, ничего не получает.

В чем проблема?

SELECT distinct K.id 
FROM Persons P 
LEFT JOIN Knows K 
ON K.guest1_id = P.id 
AND K.guest2_id = P.id 
WHERE K.id NOT IN (
    SELECT id 
    FROM Knows) 

Спасибо!

+1

Вы задаете только для строк 'Knows', где: а)' guest1' определенное лицо ** и ** б) 'guest2' что тот же человек. Это звучит не так, как вы этого хотите ...? Я кратко изложу предлагаемое решение. – Shai

+0

http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM

ответ

0

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

SELECT P.* 
FROM Persons P 
LEFT JOIN Knows K ON K.guest1_id = P.id 
WHERE K.id IS NULL 

Это даст вам Persons, которые не знают никого.

Вы также можете попробовать это:

SELECT * 
FROM Persons 
WHERE NOT EXISTS(SELECT 1 FROM Knows WHERE guest1_id = P.id) 
+0

Я вижу, к чему вы клоните, но человек, который никого не знает, все еще может быть известен кем-то еще. Должен ли я изменить KIDID NULL на один из них IS NULL? Или это не решение? – Yolopan

+0

Я отредактировал оба запроса, чтобы отразить это. Я просто удалил любую ссылку на 'guest2_id' –

0
WHERE K.id NOT IN (SELECT id FROM Knows) 

В этом случае предложение, по существу исключающее все записи данных, должно быть в идентификаторах Knows.

1

Ваш вопрос не имеет смысла и не выглядит так, как выглядит запрос. Но если вы ищете всех людей, которые не знают никого, то это означает, что человек не находится ни в столбце guest1, ни в гостевом2 в таблице Knows.

Если это так, то вы можете сделать двойной левый присоединиться к знает таблицу и просто получить те, которые не помещаются в обе стороны

SELECT 
     P.* 
    from 
     Persons P 
     LEFT JOIN Knows K1 
     on P.id = K1.guest1 
     LEFT JOIN Knows K2 
     on P.id = K2.guest2 
    where 
      K1.guest1 IS NULL 
     AND K2.guest2 IS NULL 

Так что, если ваша таблица

Persons 
ID Name 
1 A 
2 B 
3 C 
4 D 

and Knows table 
ID Guest1 Guest2 
1 1  3 
2 1  4 
3 3  4 

Тогда человек 2 является единственным человеком, который не знает ни одного другого лица, поэтому их идентификатор не находится ни в столбцах Guest1 OR Guest2 таблицы Knows.

+0

Ваш ответ кажется логичным для меня, однако он дает мне ошибку в синтаксисе SQL. Я знаю, что это очень просто, но я не могу найти синтаксическую ошибку. – Yolopan

+0

@Ypan, у меня был Person. *, А не только псевдоним P. * Запрос не смог найти ссылку на таблицу «Человек», так как это была таблица «PersonS» или псевдоним «P». Кроме того, другой ответ, который вы проверили как решение, потерпит неудачу, поскольку он никогда не тестирует человека во второй позиции. – DRapp

0

условие в вашем где предложение немного глупо:

... K.id NOT IN (SELECT id 
       FROM Knows) 

K является псевдонимом Knows, поэтому в основном это говорит: «выбрать только те строки, которые не существуют».

Кроме того, это условие не работает с NULL значениями. Я думаю, что вы пытались сделать, это на самом деле так:

SELECT P.id 
FROM Persons P 
    WHERE NOT EXISTS(
    SELECT * FROM Knows K WHERE 
     K.guest1_id = P.id OR 
     K.guest2_id = P.id) 

Этот запрос говорит: «. Выберите все лица, которые не указанные в поле guest1 и/или гость 2 поля„Знает“

. Вы также можете написать это с помощью LEFT JOIN и K.id IS NULL в ИНЕКЕ Это ближе к вашей попытки, но symantically менее точны на вопрос, и, следовательно, не является предпочтительным, на мой взгляд

SELECT distinct K.id 
FROM Persons P 
LEFT JOIN Knows K ON K.guest1_id = P.id OR K.guest2_id = P.id 
WHERE K.id IS NULL