Fun*_*Guy 3 sql-server sql-server-2000 t-sql
这是我使用查询返回的结果集:
empname itemssold
JJ 14
Run Code Online (Sandbox Code Playgroud)
但这是我想要的结果集:
empname itemssold
AA 0
BB 0
CC 0
DD 0
JJ 14
RR 0
Run Code Online (Sandbox Code Playgroud)
它似乎会拉动所有员工,直到我将where子句添加到我的查询中,这让我想知道我是否在错误的位置添加了它,或者我是否错误地设置了我的查询?
以下是我使用的 DDL 和我的查询:
Create Table #ShowAll
(
empname varchar(1000)
,empid varchar(100)
)
Create Table #Data
(
empid varchar(100)
,itemssold int
,beenverified varchar(100)
)
Insert Into #ShowAll Values
('JJ', 'J1'),
('AA', 'A1'),
('BB', 'B1'),
('CC', 'C1'),
('DD', 'D1'),
('RR', 'R1')
Insert Into #Data Values
('J1','14', 'Yes'),
('A1', '12','No'),
('B1', '13', 'No')
Select sa.empname
, Da.itemssold
FROM #ShowAll sa
LEFT JOIN #Data da
ON sa.empid = da.empid
WHERE da.beenverified = 'Yes'
Run Code Online (Sandbox Code Playgroud)
您必须将测试beenverified 从WHERE子句移至LEFT ... ON ...:
SELECT sa.empname
, coalesce(Da.itemssold, 0)
FROM #ShowAll sa
LEFT JOIN #Data da
ON sa.empid = da.empid
AND da.beenverified = 'Yes';
Run Code Online (Sandbox Code Playgroud)
随着LEFT JOIN,当有上没有匹配empid的两个表,这个查询(减去之间的WHERE条款)的回报NULL为beenverified(等栏目从#DATA):
empname itemssold beenverified
JJ 14 Yes
AA 12 No
BB 13 No
CC NULL NULL
DD NULL NULL
RR NULL NULL
Run Code Online (Sandbox Code Playgroud)
如果beenverified在WHERE子句中进行测试,则不返回不满足条件的行:
beenverified IS NULL beenverified <> 'Yes'(即= 'No')只有行JJ是有效的。通过WHERE子句中的测试,此查询的行为类似于INNER JOIN ....
Coalesce然后添加以替换NULL为0。