添加 Where 子句使数据倾斜

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)

Jul*_*eur 9

您必须将测试beenverifiedWHERE子句移至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条款)的回报NULLbeenverified(等栏目从#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)

如果beenverifiedWHERE子句中进行测试,则不返回不满足条件的行:

  • beenverified IS NULL
  • beenverified <> 'Yes'(即= 'No'

只有行JJ是有效的。通过WHERE子句中的测试,此查询的行为类似于INNER JOIN ....

Coalesce然后添加以替换NULL0