我有以下(简化)问题。 我有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,有人能告诉我吗?
谢谢!
答案 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 |
+-------+------+------+
这可能是您的情景的理想选择。