【问题标题】:Left Join not getting the resultset properly [duplicate]左连接没有正确获得结果集[重复]
【发布时间】:2019-11-26 22:24:20
【问题描述】:

我有一张名为supplier_rating 的表。此表用于存储每个供应商收到的评分和 no_of_stars。评分范围为 1-5。供应商可以拥有所有评级的条目,或者他们可以拥有一些评级。我想创建一个 SELECT 语句,它将返回供应商的所有评级。

代码 sn-ps

CREATE TABLE dbo.supplier_rating(
        supplier_id INT
        ,star       INT
        ,no_of_stars INT)

 INSERT INTO dbo.supplier_rating VALUES (100,5,50),(100,3,30),(200,2,20),(200,1,10);

我想要一个 select 语句,该语句将返回如下所示的供应商 ID = 100 的结果集

supplier_id     rating  no_of_stars
100             5       50
100             4       0
100             3       30
100             2       0
100             1       0

以下是我正在使用的查询。我正在创建临时表,该表的所有评分都在 1-5 之间,并且我正在使用 supplier_rating 表进行 LEFT JOIN,但它正在返回我想要的结果集

CREATE TABLE #temp_rating(star INT);
INSERT INTO #temp_rating VALUES (1),(2),(3),(4),(5);

SELECT r.star,sr.no_of_stars
FROM    #temp_rating r
LEFT JOIN dbo.supplier_rating sr ON r.star = sr.star
WHERE   sr.supplier_id = 100;   

【问题讨论】:

  • 很像this one?
  • 了解 LEFT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 WHERE 或 INNER JOIN ON 在 OUTER JOIN ON 删除任何由 NULL 扩展的行后,需要右 [sic] 表列不为 NULL,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。

标签: sql sql-server join left-join


【解决方案1】:

LEFT JOIN dbo.supplier_rating sr ON r.star = sr.star WHERE sr.supplier_id = 100

如果您在where 子句中对left joined 表设置条件,则该条件变为强制性,并且无法满足left join 未成功的记录。这实际上将您的left join 变成了inner join

您需要将该条件从 where 子句移至连接的 on 子句:

SELECT r.star,sr.no_of_stars 
FROM #temp_rating r 
LEFT JOIN dbo.supplier_rating sr ON r.star = sr.star AND sr.supplier_id = 100;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2021-08-23
    • 2018-03-06
    • 1970-01-01
    • 2018-08-07
    • 2012-06-23
    相关资源
    最近更新 更多