0

我有 3 个表 A、B 和 C。每个表都有一个 ID 和一个值字段。我使用什么样的连接将这些合并到一个表中,其中包含一个 ID 字段和列值 A、值 B、值 C?

自然,我只希望结果表中的每个 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 是唯一的并且在每个表中存在一次:

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

如果每个 Id 在 TableA 中唯一存在但可能在其他表中多次存在,请使用某种聚合,例如MAXor 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 是否存在于所有表中。

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 回答