【问题标题】:How to Fix Right Outer Join如何修复右外连接
【发布时间】:2019-07-15 01:28:59
【问题描述】:

我正在尝试使左外连接使用以下代码; 使用 (LEFT OUTER , RIGHT OUTER, FULL OUTER 和 INNER JOIN) 的结果是相同的结果。 我正在尝试返回所有出版商名称,包括尚未与任何书籍相关的人!

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

提前致谢

【问题讨论】:

  • 查询看起来不错(前提是 PublisherName 是唯一的,即没有两个名称完全相同的发布者)。它应该返回所有出版商的图书数量,无论是十本、千本还是零本。有什么问题?查询结果与您想要的结果有何不同?
  • 在 LR_Book 我只有 PublisherID
  • 你用它来加入LR_Publisher。那有什么问题?对我来说似乎很完美。
  • 你能添加一些数据作为例子吗?表和预期结果的当前记录。
  • 不要在 cmets 中发布样本数据。编辑您的请求并将其放在那里。

标签: sql sql-server join left-join outer-join


【解决方案1】:

没有出版书籍的出版商会被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

【讨论】:

  • 虽然这解决了 OP 问题,但请注意 GROUP BY 中的 ALL 关键字用于向后兼容。它一定会在未来的版本中被删除。
  • 感谢您的努力;我尝试您的代码,如果替换 LEFT OUTER JOIN 或 RIGHT OUTER JOIN 或 INNER JOIN ,它会给出相同的结果。不给我我需要的结果
  • @Samar.Abdeen,你能评论整个 WHERE 子句并再试一次吗? --WHERE (P.PublisherID = @pPublisherID OR @pPublisherID IS NULL)
  • @Samar.Abdeen,Manfred Wippel 的回答也是正确的,更可取的选择
  • @EzLo,谢谢,您的观点是正确的,Manfred 的回答解决了这个问题
【解决方案2】:

你可以这样写

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)

我也不知道 group by 进行的过滤。谢谢你的问题。

【讨论】:

  • 谢谢 Manfred Wippel 先生
【解决方案3】:

简单的左连接将帮助您获取所有出版商名称,包括尚未出版任何书籍的人

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

【讨论】:

  • 我需要返回所有已发布和尚未发布的发布者(两者)
  • @Samar.Abdeen answer eidited 它将返回所有出版商名称,包括已出版或未出版的书
  • 不行!它重播出版商的名字。我的意思是如果这个出版商出版了 4 本书;它给了我 4 次出版商的名字
猜你喜欢
  • 2013-12-18
  • 2014-02-24
  • 2015-06-05
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2011-04-22
  • 2012-11-07
相关资源
最近更新 更多