3つのテーブルA、B、Cがあります。各テーブルにはIDと値のフィールドがあります。これらをIDフィールドと列の値A、値B、値Cを持つ1つのテーブルに統合するには、どのような種類の結合を使用しますか?
当然、結果テーブルのIDごとに1つのレコードのみが必要です。ありがとう。
例:
表A:
1 x
2 y
表B:
2 a
3 b
表C:
2 m
必要な結果:
1 x - -
2 y a m
3 - b -
3つのテーブルA、B、Cがあります。各テーブルにはIDと値のフィールドがあります。これらをIDフィールドと列の値A、値B、値Cを持つ1つのテーブルに統合するには、どのような種類の結合を使用しますか?
当然、結果テーブルのIDごとに1つのレコードのみが必要です。ありがとう。
例:
表A:
1 x
2 y
表B:
2 a
3 b
表C:
2 m
必要な結果:
1 x - -
2 y a m
3 - b -
IDがすべてのテーブルに分散している場合は、それらを結合して、グループ化/集約します。
SELECT Id, MAX(ValueA) AS ValueA, MAX(ValueB) AS ValueB, MAX(ValueC) AS ValueC
FROM (
SELECT Id, ValueA, NULL AS ValueB, NULL AS ValueC
FROM TableA
UNION ALL
SELECT Id, NULL AS ValueA, ValueB, NULL AS ValueC
FROM TableB
UNION ALL
SELECT Id, NULL AS ValueA, NULL AS ValueB, ValueC
FROM TableC
)
GROUP BY Id
各IDが一意であり、各テーブル内に1回存在する場合:
SELECT TableA.Id, TableA.ValueA, TableB.ValueB, TableC.ValueC
FROM TableA
INNER JOIN TableB ON TableA.Id = TableB.Id
INNER JOIN TableC ON TableA.Id = TableC.Id
各IDが一意であり、TableAに存在し、一度だけ存在するか、他のテーブルに存在しない場合(存在しない値はNULL
sとして提供されます):
SELECT TableA.Id, TableA.ValueA, TableB.ValueB, TableC.ValueC
FROM TableA
LEFT OUTER JOIN TableB ON TableA.Id = TableB.Id
LEFT OUTER JOIN TableC ON TableA.Id = TableC.Id
MAX
各IDがTableAに一意に存在するが、他のテーブルに複数回存在する可能性がある場合は、次のような何らかの集計を使用しますSUM
。
SELECT TableA.Id, MAX(TableA.ValueA) AS ValueA, SUM(TableB.ValueB) AS ValueB, MIN(TableC.ValueC) AS ValueC
FROM TableA
INNER JOIN TableB ON TableA.Id = TableB.Id
INNER JOIN TableC ON TableA.Id = TableC.Id
GROUP BY TableA.Id
左参加したいようですね。また、CTEを使用して、さまざまなテーブルからすべてのIDを取得しました。
WITH ids as
(
SELECT id from table1
UNION
SELECT id from table2
UNION
SELECT id from table3
)
SELECT distinct ids.id, t1.col1, t2.col1, t3.col1
FROM ids
LEFT JOIN Table1 as t1
ON ids.id = t1.id
LEFT JOIN Table2 as t2
ON ids.id = t2.id
LEFT JOIN Table3 as t3
ON ids.id = t3.id
次のコードは、FULL JOINを使用して、IDがすべてのテーブルに存在するかどうかに関係なく、IDごとに1行を返します。
CREATE TABLE #A
( Id INT NOT NULL
, Value VARCHAR(10) NOT NULL);
CREATE TABLE #B
( Id INT NOT NULL
, Value VARCHAR(10) NOT NULL);
CREATE TABLE #C
( Id INT NOT NULL
, Value VARCHAR(10) NOT NULL);
INSERT INTO #A (Id, Value)
VALUES (1, 'x'), (2, 'y');
INSERT INTO #B (Id, Value)
VALUES (2, 'a'), (3, 'b');
INSERT INTO #C (Id, Value)
VALUES (2, 'm');
SELECT Id = COALESCE(a.Id, b.Id, c.Id)
, ValueA = a.Value
, ValueB = b.Value
, ValueC = c.Value
FROM #A a
FULL JOIN #B b
ON a.Id = b.Id
FULL JOIN #C c
ON a.Id = c.Id;