为什么不左表中把所有的行,并表示日NULL那些不匹配的?
您的LEFT JOIN
未按预期工作的原因是由于WHERE
条款中该表的条件;这有时被称为“隐式内部连接”。
这是最好的解释说明。下面是两个简单的表
| USER_ID | FIRST_NAME | LAST_NAME |
|---------|------------|------------|
| 123 | Fred | Flintstone |
| 456 | Barney | Rubble |
| ID | USER_ID | NOTE_BODY |
|-------|---------|-----------------|
| 98765 | 123 | Yabba Dabba Doo |
所以如你所料,内连接只产生一个行,其中USER_ID值两个表中的匹配。
SELECT * FROM用户üINNER JOIN user_notes N于u.User_ID = ñ。用户名;
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|-------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
而且通过改变LEFT JOIN,我们得到的所有记录中的用户,但不是所有的都来自User_Notes信息,所以我们得到的NULL这些列
SELECT * FROMüLEFT JOIN用户 user_notes n ON u.User_ID = n.User_ID;
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|--------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
| 456 | Barney | Rubble | (null) | (null) |
但是,如果我们真的只是想从连接表的一些记录会发生什么?
SELECT * FROM用户üLEFT JOIN user_notes N于u.User_ID = n.User_ID WHERE n.Note_Body = 'YABBA Dabba斗';
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|-------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
那么,如果我们使用WHERE条件,效果是作为INNER JOIN一样,现在我们没有得到所有用户的记录,这是一个隐含的内部联接。
我们没有得到所有用户记录的原因是因为我们现在坚持所有结果行必须在可能为NULL的列中具有特定值。所以,我们可以改变WHERE
条件来允许NULL。
SELECT * FROM用户üLEFT JOIN user_notes N于u.User_ID = n.User_ID WHERE(n.Note_Body = 'YABBA Dabba斗' OR n.Note_Body IS NULL);
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|--------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
| 456 | Barney | Rubble | (null) | (null) |
OR
而不是使用上,我们增加了加盟条件(ieafter ON)
SELECT * FROM用户üLEFT JOIN连接表的WHERE子句user_notes n ON u.User_ID = n.User_ID AND n.Note_Body ='Yabba Dabba斗“;
| USER_ID | FIRST_NAME | LAST_NAME | ID | NOTE_BODY |
|---------|------------|------------|--------|-----------------|
| 123 | Fred | Flintstone | 98765 | Yabba Dabba Doo |
| 456 | Barney | Rubble | (null) | (null) |
所以,要小心使用外连接,你的where子句不会覆盖外连接允许空值。
See the above as a SQLFiddle demonstration
会发生什么情况是,从表pdwspend每个b.'Child供应商ID'可能会出现数百次。当我没有它时,它会带来每一场比赛,所以我有很多重复的行。我认为一个更好的解决方案可能会在这一方面......这也给我一个错误!: – nangys 2014-09-21 05:18:20
SELECT a.'BW Parent Number',a.'Vendor Name',b。'父供应商Name' FROM磨砂AS一 LEFT OUTER JOIN( SELECT DISTINCT'儿童供应商ID' FROM pdwspend WHERE'year' = 2014 和'BU ID' = 'BU_1' 和版本LIKE“% GOV%')AS b ON a.'BW Parent Number' = b.'Child Supplier ID' WHERE a.'year' = 2014#1054 - '字段列表'中的未知列'b.Parent Supplier Name' – nangys 2014-09-21 05:20:13
您在'select distinct subquery'内不包含'b.Parent Supplier Name'。重新看Brian的查询并复制它 – 2014-09-21 23:24:06