左边连接3个表,其中Where不按预期工作

时间:2018-05-18 06:13:45

标签: sql left-join

我有2个表,例如:

Versions         Names                        Cell
ID Version       ID   Name   Indicator        ID   Number
1   1.0          1    Joe     Y               1    1234 
2   1.1          1    Black   N               2    5678 
3   1.2          2    David   N               3    4786
4   2.0          2    Troy    N
                 2    George  Y

预期产出

ID  Number       Version   Name   Indicator   
1   1234         1.0       Joe     Y             
2   5678         1.1       George  Y          
3   4786         1.2       NULL    NULL       

我想要

  1. 来自"版本"的所有记录表"版本"从" 1"开始和
  2. "姓名"和"指标" as" Y"来自"姓名"来自#1和
  3. 的记录表
  4. "数"来自" Cell"表#1
  5. 我想我需要LEFT JOIN。这不会给我预期的输出。我哪里错了?

       SELECT a.ID, b.Number, a.Version, c.Name, c.Indicator
       FROM Version a LEFT JOIN Cell b ON a.ID = b.ID
       LEFT JOIN Names c ON a.ID = c.ID
       WHERE a.Version LIKE '1%' AND c.Indicator = 'Y'
    

2 个答案:

答案 0 :(得分:1)

在"外部联合"上应用条件WHERE子句中的表有效地将外连接转换为内连接,因为外连接保留的每一行在该列中都包含null值,但条件c.Indicator = 'Y'在where子句中将再次删除这些行。

要解决此问题,请将c.Indicator = 'Y'移至加入条件:

SELECT a.ID, b.Number, a.Version, c.Name, c.Indicator
FROM Version a 
  LEFT JOIN Cell b ON a.ID = b.ID
  LEFT JOIN Names c ON a.ID = c.ID AND c.Indicator = 'Y'
WHERE a.Version LIKE '1%' 

答案 1 :(得分:0)

我回答有两个原因:

  • 我认为version条件不正确。
  • 修复表别名。

所以,我认为你真的想要:

SELECT v.ID, c.Number, v.Version, n.Name, n.Indicator
FROM Version v LEFT JOIN
     Cell c
     ON v.ID = c.ID LEFT JOIN
     Names n
     ON v.ID = n.ID AND n.Indicator = 'Y'
WHERE v.Version LIKE '1.%';

.的原因是WHERE子句与11.0101.3不匹配。

更改表别名的原因是因为使用表缩写的查询更容易理解。