【问题标题】:SQL UNION and MERGESQL UNION 和 MERGE
【发布时间】:2017-12-04 20:07:22
【问题描述】:

我有多个涉及许多表和联接的选择语句。所有的选择语句都有相同的标题。我正在尝试将所有这些组合成一个结果集。那么 SQL UNIONMERGE 哪种方法更好? 我知道 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 用于将INSERTUPDATEDELETE 操作组合成一个语句。由于您只对SELECT 感兴趣,因此您应该使用UNION。但是,仍然存在您希望如何处理两个表中都出现的 ID 2 的问题。您是想将它们组合在一起,还是采用具有Name 值或其他业务逻辑的那个?

标签: sql sql-server merge union


【解决方案1】:

GROUP BYUNION 的结果。使用MAX() 返回名称:

select ID, MAX(NAME), VitalName 
from
(
    SELECT ID, NAME, VitalName as VitalName FROM TABLE A
    UNION ALL
    SELECT ID, NAME, VitalReadings as VitalName FROM TABLE B
) dt
group by ID, VitalName 

【讨论】:

    【解决方案2】:

    使用 union 然后使用 select distinct 删除重复项。

    例如SELECT DISTINCT * FROM (SELECT ID, NAME, VitalName as VitalName FROM TABLE_A UNION SELECT ID, NAME, VitalReadings as VitalName FROM TABLE_B) as TABLE_C

    【讨论】:

      【解决方案3】:

      UNIONMERGE 完全不同的概念,都不能解决你的问题。但是可以使用FULL JOIN 来制作这个。

      DECLARE @TableA TABLE (ID INT,  Name VARCHAR(10), VitalName VARCHAR(10))
      INSERT INTO @TableA VALUES
      (1,'AAA','HeartRate'),
      (2,NULL,'Systolic'),
      (3,NULL,'Diastolic')
      
      DECLARE @TableB TABLE ( ID INT,  Name VARCHAR(10), VitalReadings VARCHAR(10))
      
      INSERT INTO @TableB VALUES
      (1,'AAA','HeartRate'),
      (2,'BBB','Systolic')
      
      
      SELECT 
          A.ID, 
          COALESCE(A.Name, B.Name) Name,
          COALESCE(A.VitalName, B.VitalReadings) VitalName
      FROM 
          @TableA A 
          FULL JOIN @TableB B ON A.ID = B.ID
      

      结果:

      ID          Name       VitalName
      ----------- ---------- ----------
      1           AAA        HeartRate
      2           BBB        Systolic
      3           NULL       Diastolic
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 2018-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多