2

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

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

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

数据示例可能如下所示:

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

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

TableB
--------------
Key1 | BValue1

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

Key1 | BValue1  
Key2 | Value2  
Key3 | AValue3  
Key4 | Value4  
Key5 | AValue5  

我玩过各种连接,但似乎无法破解它,我们将不胜感激。

谢谢

4

2 回答 2

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

要进一步了解有关联接的更多信息,请访问以下链接:

输出

╔═════════╦═════════╗
║ COLUMN1 ║ COLUMN2 ║
╠═════════╬═════════╣
║ Key1    ║ BValue1 ║
║ Key2    ║ Value2  ║
║ Key3    ║ AValue3 ║
║ Key4    ║ Value4  ║
║ Key5    ║ AValue5 ║
╚═════════╩═════════╝

从此链接引用:与postgresql的性能比较:left join vs union all我希望与postgresql相同SQL Server)。

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

于 2013-03-30T10:01:01.233 回答
1

首先将您之前的两个表中的值RIGHT JOIN(与 相同的效果LEFT JOIN)合并到默认值可能更有效:

SELECT d.key_col
      ,COALESCE(t.value, d.value) AS value
FROM  (
    SELECT key_col, value FROM tbl_a
    UNION ALL
    SELECT key_col, value FROM tbl_b
    ) t
RIGHT  JOIN default_tbl d ON t.key_col = d.key_col;

正如您在评论中提供的那样,我使用, 因为和UNION ALL之间不能重叠。tbl_atbl_b

->SQLfiddle

于 2013-03-30T10:15:41.597 回答