Как исправить правое внешнее соединение - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь использовать левое внешнее соединение, используйте приведенный ниже код;Использование результата (ВЛЕВО НАРУЖНО, ВПРАВО НА ВЫХОД, ПОЛНОЕ НАРУЖНОЕ И ВНУТРЕННЕЕ СОЕДИНЕНИЕ) является одним и тем же результатом.Я пытаюсь вернуть все имена издателей, включая тех, кто еще не связан ни с одной книгой!

SELECT P.PublisherName,
    COUNT(B.BookID) AS BookPublished
    FROM LR_Publisher AS P LEFT OUTER JOIN LR_Book As B 
    ON P.PublisherID = B.PublisherID
    WHERE (P.PublisherID = @pPublisherID OR @pPublisherID IS NULL)
    GROUP BY PublisherName

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Издатели, у которых нет опубликованных книг, отфильтровываются по GROUP BY.Это можно исправить с помощью GROUP BY ALL:

SELECT P.PublisherName,
COUNT(B.BookID) AS BookPublished
FROM LR_Publisher AS P 
LEFT OUTER JOIN LR_Book As B    ON P.PublisherID = B.PublisherID
-- WHERE (P.PublisherID = @pPublisherID OR @pPublisherID IS NULL)
GROUP BY PublisherName
0 голосов
/ 21 февраля 2019

Вы могли бы написать это так

select P.PublisherName,
       isnull(bi.BookPublished, 0) as BookPublished
from LR_Publisher as P
    left join (
        select B.PublisherID, Count(B.BookID) BookPublished
        from LR_Book as B 
        where (@pPublisherID is null or B.PublisherID = @pPublisherID)
        group by B.PublisherID
    ) bi on P.PublisherID = Bi.PublisherID
where (@pPublisherID is null or P.PublisherID = @pPublisherID)

Я также не знал о фильтрации, выполненной по группам.Спасибо за вопрос.

0 голосов
/ 21 февраля 2019

Простое объединение влево поможет вам указать все имена издателей, включая тех, кто еще не опубликовал ни одной книги

   SELECT P.PublisherName 
    FROM LR_Publisher AS P LEFT OUTER JOIN LR_Book As B 
    ON P.PublisherID = B.PublisherID
...