联盟,除了或拦截使用默认数据?

she*_*nku 2 sql t-sql sql-server select

我有三个表,一个是默认值表.

我需要做的是选择TableA和TableB的值,并从默认值的选择中回填任何缺失值.

每个表都有一个Key和Value列.

数据的示例可能如下所示:

DefaultTable
-------------
Key1 | Value1  
Key2 | Value2  
Key3 | Value3  
Key4 | Value4  
Key5 | Value5  

TableA
--------------
Key3 | AValue3
Key5 | AValue5

TableB
--------------
Key1 | BValue1
Run Code Online (Sandbox Code Playgroud)

所以我的最终数据集需要如下所示:

Key1 | BValue1  
Key2 | Value2  
Key3 | AValue3  
Key4 | Value4  
Key5 | AValue5  
Run Code Online (Sandbox Code Playgroud)

我玩各种连接,但似乎无法破解它,你的帮助将不胜感激.

谢谢

Joh*_*Woo 5

你可以使用LEFT JOIN这个.

SELECT  a.Column1,
        COALESCE(b.Column2, c.Column2, a.Column2) Column2
FROM    DefaultTable a
        LEFT JOIN TableA b
            ON a.Column1 = b.Column1
        LEFT JOIN TableB c
            ON a.Column1 = c.Column1
Run Code Online (Sandbox Code Playgroud)

要进一步了解联接,请访问以下链接:

OUTPUT

?????????????????????
? COLUMN1 ? COLUMN2 ?
?????????????????????
? Key1    ? BValue1 ?
? Key2    ? Value2  ?
? Key3    ? AValue3 ?
? Key4    ? Value4  ?
? Key5    ? AValue5 ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

引自这个链接:与postgresql的性能比较:left join vs union all(我希望它与之相同SQL Server).

使用LEFT JOIN的查询是利用索引的最佳选择.例如,如果您想要排序结果,那么UNION查询将是最慢的.或者,如果您的查询是主查询中的子查询,则UNION将阻止对表[element]索引的任何可能利用.因此,执行此类子查询的JOIN或WHERE会很慢.

  • 加上一个用于sqlfiddle,从来不知道那个,会快速实现... (2认同)