Sql server 避免SQL Server中的所有联合
我有以下(简化的)问题。 我有3个表:MainTable、TableId1和TableId2。它们看起来像这样 主表Sql server 避免SQL Server中的所有联合,sql-server,union-all,Sql Server,Union All,我有以下(简化的)问题。 我有3个表:MainTable、TableId1和TableId2。它们看起来像这样 主表 +-------+------+-----+ | Type | Id1 | Id2 | +-------+------+-----+ | a | 0 | 3 | | b | 1 | 0 | +-------+------+-----+ 表1 +-----+------+ | Id1 | code | +-----+------+ |
+-------+------+-----+
| Type | Id1 | Id2 |
+-------+------+-----+
| a | 0 | 3 |
| b | 1 | 0 |
+-------+------+-----+
表1
+-----+------+
| Id1 | code |
+-----+------+
| 1 | abc |
+-----+------+
表ID2
+-----+------+
| Id2 | code |
+-----+------+
| 3 | xyz |
+-----+------+
我希望获得以下结果集:
+-------+------+
| Type | code |
+-------+------+
| a | xyz |
| b | abc |
+-------+------+
我现在使用的是UNIONALL,但它并不优雅,当我的查询变得更复杂,我不得不编辑它时,它会成为一种痛苦
我希望这里有一个避免联合的方法,有人能告诉我吗
谢谢 使用
左外部联接
并对Id1和Id2!使用where子句0。
将在一分钟后发布查询。使用左外部联接
并使用where子句作为Id1和Id2!=0。
将在一分钟后发布查询
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
定义一个从所有这三个表中获取数据的视图(使用UNION all或not)。这样,当查询“变得复杂”时,您必须修改一段代码。定义一个从所有这3个表中获取数据的视图(使用UNION all或not)。这样,当查询“变得复杂”时,您必须修改一段代码。您可以尝试:
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 |
+-------+------+------+
这对您的场景来说可能是理想的,也可能不是理想的。您可以尝试:
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 |
+-------+------+------+
对于您的场景来说,这可能是理想的,也可能不是理想的。继续在哪里?对不起,伙计们,我不小心按下了提交按钮…继续在哪里?对不起,伙计们,我无意中点击了提交按钮,@Luv使用IsNull的答案会给你一个更接近你要求的结果。@Luv使用IsNull的答案会给你一个更接近你要求的结果。谢谢,这是我需要的。谢谢,这是我需要的。这对我来说不是最好的,但我会记住,总有一天我会需要它,我认为这对我的情况来说不是最好的,但我会记住它,总有一天我会需要它