Skip to content Skip to sidebar Skip to footer

What Kind Of Join Do I Need To Use To Create One Table From Many?

I have 3 tables A, B and C. Each table has an ID and a value field. What kind of join do I use to consolidate these into one table with an ID field and columns value A, value B, va

Solution 1:

If the Ids are distributed across all the tables, union them together and group/aggregate on that:

SELECT Id, MAX(ValueA) AS ValueA, MAX(ValueB) AS ValueB, MAX(ValueC) AS ValueC
FROM (
    SELECT Id, ValueA, NULLAS ValueB, NULLAS ValueC
    FROM TableA
    UNIONALLSELECT Id, NULLAS ValueA, ValueB, NULLAS ValueC
    FROM TableB
    UNIONALLSELECT Id, NULLAS ValueA, NULLAS ValueB, ValueC
    FROM TableC
)
GROUPBY Id

If each Id is unique and exists once within each table:

SELECT TableA.Id, TableA.ValueA, TableB.ValueB, TableC.ValueC
FROM TableA
INNERJOIN TableB ON TableA.Id = TableB.Id
INNERJOIN TableC ON TableA.Id = TableC.Id

If each Id is unique, exists in TableA and is present either once or doesn't exist in the other tables (non-existant values get supplied as NULLs):

SELECT TableA.Id, TableA.ValueA, TableB.ValueB, TableC.ValueC
FROM TableA
LEFTOUTERJOIN TableB ON TableA.Id = TableB.Id
LEFTOUTERJOIN TableC ON TableA.Id = TableC.Id

If each Id exists uniquely in TableA but may exist multiple times in the other tables, use some sort of aggregation, like MAX or 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
GROUPBY TableA.Id

Solution 2:

Sounds like you want a left join. I also used a CTE to get all the ids from the various tables:

WITH ids as
(
    SELECT id from table1
    UNION
    SELECT id from table2
    UNION
    SELECT id from table3
)

SELECTdistinct 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

Solution 3:

The following code uses FULL JOIN to return one row per ID whether or not the ID exists in all of the tables.

CREATETABLE #A
    ( Id INTNOTNULL
    , ValueVARCHAR(10) NOTNULL);

CREATETABLE #B
    ( Id INTNOTNULL
    , ValueVARCHAR(10) NOTNULL);

CREATETABLE #C
    ( Id INTNOTNULL
    , ValueVARCHAR(10) NOTNULL);

INSERTINTO #A (Id, Value)
VALUES (1, 'x'), (2, 'y');

INSERTINTO #B (Id, Value)
VALUES (2, 'a'), (3, 'b');

INSERTINTO #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
FULLJOIN #B b
    ON a.Id = b.Id
FULLJOIN #C c
    ON a.Id = c.Id;

Post a Comment for "What Kind Of Join Do I Need To Use To Create One Table From Many?"