2016-07-21 6 views
2

У меня есть следующий запросПочему LEFT OUTER JOIN не работает?

SELECT COUNT(*) FROM Samples 

возвращение 628.

Хотя следующий запрос

SELECT * FROM 
    (

    SELECT 
    sa.*, 
    tagLists.tagNames AS tagNames, 
    tagLists.ProjectID AS ProjectID 
     FROM Samples sa 
     LEFT OUTER JOIN TagLists tagLists 
      ON sa.spotID = tagLists.taggedItemID 
      AND 6 = tagLists.taggedItemType 
) ex 

    WHERE ex.ProjectID IS NULL 

возвращается пустая таблица.

Другими словами, внешнее соединение запрос,

SELECT 
     sa.*, 
     tagLists.tagNames AS tagNames, 
     tagLists.ProjectID AS ProjectID 
      FROM Samples sa 
      LEFT OUTER JOIN TagLists tagLists 
       ON sa.spotID = tagLists.taggedItemID 
       AND 6 = tagLists.taggedItemType 

не содержит какой-либо строка с ProjectID равна нулю.

Почему? Не стоит LEFT OUTER JOIN гарантировать, что все строки из левой таблицы должны присутствовать? не

UPDATE

К сожалению, конечно нет не-нулевых строк присоединился фактически в tagLists.

UPDATE 2

К сожалению, ребята, я дурак: там действительно были ненулевые строки я не заботиться о ...

+5

Вы не указали нам никаких данных, сделав этот комментарий умозрительным, но если каждая запись в «Образцах» соответствует записи в «TagLists», тогда 'ex.ProjectID' никогда не будет' NULL', что даст ваш текущий результат. –

ответ

4

Единственная ситуация, когда ваш запрос будет возвращать данные не когда каждая строка Samples имеет соответствующую строку в TagLists, удовлетворяющую условию объединения, причем все такие строки имеют не-NULL значение в поле ProjectID. Другими словами, каждый образец имеет элемент списка тегов типа 6.

Хорошим способом проверить это было бы удаление предложения WHERE и проверка того, что все 628 строк вернули действительный ProjectID.

+0

Это очень похоже на мой комментарий. Как насчет того, чтобы дать этот комментарий вверх? –