【问题标题】:How to combine multiple tables that vary slightly in columns如何组合列中略有不同的多个表
【发布时间】:2011-10-08 17:29:01
【问题描述】:

我有多个表,其中大约有 10 个公共列,但有些表有 1-2 个额外列。

我想将所有这些表合并到一个表中,每个表中的每一行都有一行,每个特定行的源表中不存在的任何列都具有 NULL 值。

所以我的输入大致如下:

table1
id  |  colA  | colB

table2
id  |  colA  | colB  | colC

table3
id  |  colA  | colB  | colD

我正在努力做到这一点:

allTables
id  |  colA  | colB  | colC | colD

在上面的示例中,table1 中的所有行在 allTables 中 colC 和 colD 的值为 NULL,table2 中的所有行 colD 的值为 null,table3 中的所有行 colC 中的值都为 null。

几个注意事项:

  • 表之间的列 id 不相同或不相关
  • 我的示例显示了 3 个表,但我有大约 8-9 个。
  • 每个源表中都存在重复行,应予以保留。

我特别感兴趣的是是否有类似于投票最多的here 的答案或类似的更概括的答案。

【问题讨论】:

    标签: sql join union


    【解决方案1】:
    SELECT
        id,
        colA,
        colB,
        NULL AS colC,
        NULL AS colD
    FROM
        Table1
    UNION ALL
    SELECT
        id,
        colA,
        colB,
        colC,
        NULL AS colD
    FROM
        Table2
    UNION ALL
    SELECT
        id,
        colA,
        colB,
        NULL AS colC,
        colD
    FROM
        Table3
    

    由于 id 不相关,您可能还想跟踪该行来自哪个表,以防表之间存在重复。为此,只需在三个SELECT 语句中的每一个中使用具有不同值的别名的硬编码值。

    【讨论】:

    • 你的最后一部分有 ColC 而没有。
    【解决方案2】:

    你可以试试这个:

    SELECT id, colA, colB, NULL AS colc, NULL AS cold
    FROM table1
    
    UNION ALL
    
    SELECT id, colA, colB, colc, NULL AS cold
    FROM table2
    
    UNION ALL
    
    SELECT id, colA, colB, NULL AS colc, cold
    FROM table3
    

    【讨论】:

      【解决方案3】:

      您可以使用UNION

                SELECT id, colA, colB, null AS colC, null AS colD FROM table1
      UNION ALL SELECT id, colA, colB,         colC, null AS colD FROM table2
      UNION ALL SELECT id, colA, colB, null AS colC,         colD FROM table3;
      

      正如 cmets 中所讨论的,如果您想丢弃不同表中的重复项,您可以使用 UNION/UNION DISTINCT 更改此设置。感谢评论者。

      【讨论】:

      • 使用 UNION ALL 可能会更好。否则得到我的投票。
      • UNION 将丢失所有重复的行。问题没有具体说明是否可以,但应该指出。
      【解决方案4】:

      你需要的是UNION:

      SELECT id, colA, colB, null as colC, null as colD
      FROM table1
      UNION
      SELECT id, colA, colB, colC, null as ColD
      FROM table2
      UNION
      SELECT id, colA, colB, null as colC, cold
      FROM table3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 2014-03-19
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        相关资源
        最近更新 更多