0

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 -
4

3 に答える 3

2

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に存在し、一度だけ存在するか、他のテーブルに存在しない場合(存在しない値はNULLsとして提供されます):

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
于 2013-03-25T23:22:35.050 に答える
1

左参加したいようですね。また、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
于 2013-03-25T23:22:24.047 に答える
1

次のコードは、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;
于 2013-03-25T23:23:14.937 に答える