【发布时间】:2017-12-04 20:07:22
【问题描述】:
我有多个涉及许多表和联接的选择语句。所有的选择语句都有相同的标题。我正在尝试将所有这些组合成一个结果集。那么 SQL UNION 或 MERGE 哪种方法更好?
我知道 UNION 是 A+B。因此,如果表 A 中的一列为 NULL 并且它在表 B 中有一个值,那么 UNION 会给我两行,对吗?因此,如果我想根据 id 将所有行组合成一行,我应该使用 MERGE 吗?我可以选择在 SQL 或 SSIS 中执行此操作。
SELECT ID, NAME, VitalName as VitalName FROM TABLE A
UNION
SELECT ID, NAME, VitalReadings as VitalName FROM TABLE B
表A
+----+------+-----------+
| ID | Name | VitalName |
+----+------+-----------+
| 1 | AAA | HeartRate |
| 2 | | Systolic |
| 3 | | Diastolic |
+----+------+-----------+
表B
+----+------+---------------+
| ID | Name | VitalReadings |
+----+------+---------------+
| 1 | AAA | HeartRate |
| 2 | BBB | Systolic |
+----+------+---------------+
预期结果
+----+------+---------------+
| ID | Name | VitalName |
+----+------+---------------+
| 1 | AAA | HeartRate |
| 2 | BBB | Systolic |
| 3 | | Diastolic |
+----+------+---------------+
【问题讨论】:
-
我会将它们合并在一起,并在外部查询中使用 Row_Number 和/或 Rank 来处理重复项。合并可以用于您的情况,但并不是真正为这种类型的事情而设计的。
-
联合的重点是不允许重复(与所有联合不同),但它本身不会让 Systolic 看起来像 @shockwave 想要的
-
MERGE用于将INSERT、UPDATE和DELETE操作组合成一个语句。由于您只对SELECT感兴趣,因此您应该使用UNION。但是,仍然存在您希望如何处理两个表中都出现的 ID 2 的问题。您是想将它们组合在一起,还是采用具有Name值或其他业务逻辑的那个?
标签: sql sql-server merge union