连接表中的列数,但包括零(无法使LEFT JOIN工作)

时间:2018-06-19 09:55:54

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

我必须去桌子。一个用户(称为Actor),另一个带订单(称为Ord)。

每个订单都可以分配给一个用户,但并非所有订单都分配了用户。

我想制作一个返回所有用户的select语句,并显示为每个用户分配的订单数量。包括那些没有分配订单的用户。

非常简单,但出于某种原因,我无法让它发挥作用。

这是我到目前为止所得到的:

SELECT Usr, COUNT(Ord.OrdNo)
FROM Actor
    LEFT JOIN Ord on Actor.EmpNo = Ord.Rsp
WHERE Actor.Gr2 <> 9
    AND Actor.R1 = 10
    AND Ord.OrdTp = 6
    AND Ord.OrdPrSt2 != 0x10
GROUP BY Actor.Usr

这只会返回分配了订单的用户,但我希望所有用户都返回,如果他们没有分配订单,则返回零。

请忽略WHERE条款(我还没有在下面的示例数据中包含列/值)。尽管如此,我仍然可以在我的实时数据上运行查询时返回大约10个用户。

示例数据

表:演员

Usr      EmpNo
----------------
ben      123
jane     124
jack     125
tom      126

表:订单

OrdNo    Rsp
----------------
555551   123
555552   123
555553   124
555554   126

这是我想要的回复:

Usr      Count
----------------
123      2
124      1
125      0
126      1

但我得到了这个:

Usr      Count
----------------
123      2
124      1
126      1

那么我错过了什么?

2 个答案:

答案 0 :(得分:1)

将Ord条件从WHERE移至ON以获得真实LEFT JOIN结果:

SELECT Usr, COUNT(Ord.OrdNo)
FROM Actor
    LEFT JOIN Ord on Actor.EmpNo = Ord.Rsp
        AND Ord.OrdTp = 6
        AND Ord.OrdPrSt2 != 0x10
WHERE Actor.Gr2 <> 9
    AND Actor.R1 = 10
GROUP BY Actor.Usr

答案 1 :(得分:0)

没有where条件我得到了理想的结果。这是我跑的代码:

enter image description here

选择a.empno,     计数(ordrno)
    从演员左边加入订单b     在a.empno = b.rsp
    分组由a.empno