SQL Server оставил соединение с условиями, не дающими мне результатов - PullRequest
0 голосов
/ 09 июня 2011

Сначала запрос, а затем вопрос:

SELECT  DISTINCT p.postID, p.postGUID, p.postTitle, p.postTypeID, p.sequence, m.firstname, m.lastname, pt.postTypeName, mc.acceptRejectDate
FROM    post p
INNER JOIN member m ON p.memberGUID = m.memberGUID
INNER JOIN postType pt ON p.postTypeID = pt.postTypeID
LEFT JOIN masterClass mc ON (p.postGUID = mc.postGUID AND mc.isMemberPrivate = 0 AND mc.status = 2 AND mc.acceptRejectDate IS NOT NULL)
WHERE   p.postTitle LIKE '%five%'
AND p.isActive = 1
ORDER BY    p.postTypeID, p.sequence, mc.acceptRejectDate

Здесь я пытаюсь получить все результаты из таблицы «posts», в которой isActive = 1, а заголовок содержит «пять».Достаточно просто.

Некоторые результаты также связаны с таблицей masterClass.Для этих результатов я хочу включить их только в том случае, если isMemberPrivate равен нулю, статус равен 2 и существует acceptRejectDate.

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

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

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

Читая ваш вопрос, я полагаю, что вы хотите включить все результаты, которые либо не имеют записей в таблице masterClass, либо содержат записи в таблице masterClass, которые соответствуют вашим критериям. Если вы переместите свои критерии вниз в раздел WHERE и добавите проверку для записей, которые ничего не соответствуют в таблице masterClass, вы должны получить то, что хотите.

SELECT  DISTINCT p.postID, p.postGUID, p.postTitle, p.postTypeID, p.sequence, m.firstname, m.lastname, pt.postTypeName, mc.acceptRejectDate
FROM    post p
INNER JOIN member m ON p.memberGUID = m.memberGUID
INNER JOIN postType pt ON p.postTypeID = pt.postTypeID
LEFT JOIN masterClass mc ON p.postGUID = mc.postGUID
WHERE   p.postTitle LIKE '%five%'
AND p.isActive = 1
AND ( mc.postGUID is NULL OR 
     (mc.isMemberPrivate = 0 AND mc.status = 2 AND mc.acceptRejectDate IS NOT NULL)
    )
ORDER BY    p.postTypeID, p.sequence, mc.acceptRejectDate

Редактировать: изменено поле для поиска значений NULL с mc.acceptRejectDate на mc.postGUID

0 голосов
/ 10 июня 2011

Попробуйте это четко разделить СОЕДИНЕНИЕ и условия фильтрации

...
LEFT JOIN
(
SELECT postGUID, acceptRejectDate
FROM masterClass
WHERE isMemberPrivate = 0 AND status = 2 AND acceptRejectDate IS NOT NULL
) mc ON p.postGUID = mc.postGUID
...
...