2017-12-04 12 views
0

私は、多数のテーブルと結合を含む複数のselect文を持っています。すべてのselectステートメントは同じヘッダーを持ちます。私はこのすべてを1つの結果セットにまとめようとしています。したがって、どちらのアプローチがより良いSQL UNIONまたはMERGEですか? 私はUNIONがA + Bであることを知っています。したがって、テーブルAのカラムがNULLで、テーブルBに値がある場合、UNIONは2つのローを与えますか?ですから、もし私がMERGEを使うべきであれば、idに基づいてすべての行を1つの行にまとめたいのですか? SQLまたはSSISでこれを行うオプションがあります。SQL UNIONとMERGE

SELECT ID, NAME, VitalName as VitalName FROM TABLE A 
UNION 
SELECT ID, NAME, VitalReadings as VitalName FROM TABLE B 

TableAの

+----+------+-----------+ 
| ID | Name | VitalName | 
+----+------+-----------+ 
| 1 | AAA | HeartRate | 
| 2 |  | Systolic | 
| 3 |  | Diastolic | 
+----+------+-----------+ 

TableBの

+----+------+---------------+ 
| ID | Name | VitalReadings | 
+----+------+---------------+ 
| 1 | AAA | HeartRate  | 
| 2 | BBB | Systolic  | 
+----+------+---------------+ 

期待される結果

+----+------+---------------+ 
| ID | Name | VitalName  | 
+----+------+---------------+ 
| 1 | AAA | HeartRate  | 
| 2 | BBB | Systolic  | 
| 3 |  | Diastolic  | 
+----+------+---------------+ 
+0

私は労働組合それらをすべて一緒に、重複を処理するために、外側のクエリの使用ROW_NUMBERおよび/またはランクだろう。マージはあなたのケースで使用することができますが、本当にこのタイプのもののために作られていません。 –

+0

ユニオンのポイントは(ユニオンallとは異なり)重複を許さないものですが、それ自体でシストリックが@shockwaveのように見えることはありません – user8834780

+0

'MERGE'は' INSERT'、 'UPDATE'、 DELETE'操作を1つのステートメントに追加します。 'SELECT'だけに興味があるので、UNIONを使うべきです。しかし、両方のテーブルに表示されるID 2をどのように処理したいかという問題はまだあります。それらを一緒に組み合わせようとしているのですか、または 'Name'値などのビジネスロジックを持っているものを取っていますか? –

答えて

0

利用組合して、重複を削除するために明確な選択を使用します。

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

2

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 
1

GROUP BYUNIONの結果。 NAMEを返すように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