避免在SQL Server中使用UNION ALL

时间:2014-04-08 12:12:45

标签: sql-server union-all

我有以下(简化)问题。 我有3个表:MainTable,TableId1和TableId2。他们看起来像这样

MainTable

+-------+------+-----+
| Type  | Id1  | Id2 |
+-------+------+-----+
| a     | 0    |   3 |
| b     | 1    |   0 |
+-------+------+-----+

TableId1

+-----+------+
| Id1 | code |
+-----+------+
|   1 | abc  |
+-----+------+

TableId2

+-----+------+
| Id2 | code |
+-----+------+
|   3 | xyz  |
+-----+------+

我想获得以下结果集:

+-------+------+
| Type  | code |
+-------+------+
| a     | xyz  |
| b     | abc  |
+-------+------+

我现在正在使用UNION ALL,但它不优雅,当我的查询变得更复杂并且我必须编辑它等时会变得很痛苦。

我希望有一种方法可以避免UNION ALL,有人能告诉我吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

使用LEFT OUTER JOIN并使用Id1 and Id2 != 0.的where子句将在一分钟内发布查询。

答案 1 :(得分:1)

select type,isnull(tid1.code,tid2.code) as Code
from MainTable mt
left join TableId1 tid1 on mt.Id1=tid1.Id1
left join TableId2 tid2 on mt.Id2=tid2.Id2

<强> SQL Fiddle to test Query

答案 2 :(得分:1)

定义一个从所有这三个表中获取数据的视图(使用UNION ALL或不使用UNION ALL)。这样,当您的查询“变得复杂”时,您将不得不修改单个代码。

答案 3 :(得分:1)

你可以尝试:

SELECT 
    mt.Type
    ,t1.Code
    ,t2.Code
FROM 
    MainTable  mt
        LEFT OUTER JOIN TableId1 t1
        ON mt.Id1 = t1.Id1
            LEFT OUTER JOIN TableId2 t2
            ON mt.Id2 = t1.Id2

然而,这会给你:

+-------+------+------+
| Type  | code | code |
+-------+------+------+
| a     | null | xyz  |
| b     | abc  | null |
+-------+------+------+

这可能是您的情景的理想选择。