【问题标题】:How to join two tables together and return all rows from both tables, and to merge some of their columns into a single column如何将两个表连接在一起并返回两个表中的所有行,并将它们的一些列合并到一个列中
【发布时间】:2016-04-28 13:56:56
【问题描述】:

我正在使用 SQL Server 2012 并希望查询以下内容:

我有 2 个表,其中大部分列不同。 (一张表有 10 列,另一张有 6 列)。 但是它们都包含一列 ID 号和另一列 category_name。

  1. 表之间的 ID 号可能重叠(例如,1 个表可能有 200 个不同的 ID,而其他 900 个但只有 120 个 ID 在两者中)。
  2. 每个表的类别名称不同且唯一。

现在我希望有一个包含两个表的所有行的表,其中包含一个 ID 列和一个 Category_name 列(总共 14 列)。 因此,如果相同的 ID 在表 1 中有 3 条记录,在表 2 中有 5 条记录,我希望拥有所有 8 条记录(8 行)

我认为这里的复杂之处在于只有一个“Category_name”列。

我尝试了以下方法,但是当两个表中都没有 null 时,我只得到一个记录而不是两个:

SELECT isnull(t1.id, t2.id) AS [id]
    ,isnull(t1.[category], t2.[category_name]) AS [category name]
FROM t1
FULL JOIN t2
    ON t1.id = t2.id;

对正确的方法有什么建议吗?

【问题讨论】:

  • 一个 UNION ALL 将符合您的标准并且非常简单。您只需要在联合的第一条语句中创建一些列,这些列将是 NULL,以便第二个联合在某个地方粘贴它的数据。

标签: sql sql-server database join


【解决方案1】:

让你的FULL JOIN ON 1=0

这将防止行合并并确保您始终从每个表中获得每行的 1 个副本。

进一步说明:

A FULL JOIN 从两个表中获取行,无论它们是否匹配,但是当它们匹配时,它将它们组合在一行中。

您想要一个从不合并行的完全联接,因为您希望两个表中的每一行都出现一次,无论如何。 1 永远不能等于 0,因此在 1=0 上执行 FULL JOIN 将为您提供一个完全连接,其中没有任何行相互匹配。

当然,您已经在执行 ISNULL 以确保 ID 和 Name 列始终具有值。

【讨论】:

  • 嗨标签谢谢!它似乎工作。您能否进一步解释一下这个概念及其作用,我以前从未听说过声明“1=0”的可能性
  • 为我的回答添加了额外的解释。
【解决方案2】:

SELECT ID,Category_name,(然后是其他8列),NULL,NULL,NULL,NULL 从 t1

联合所有

SELECT ID, Category_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, (然后是其他 4 列) 从 t2 开始

【讨论】:

    【解决方案3】:

    这演示了如何使用 UNION ALL 组合来自两个表 TableA 和 TableB 的行集,并将该集插入到 TableC 中。

    用一些数据创建两个源表:

    CREATE TABLE dbo.TableA
    (
        id int NOT NULL,
        category_name nvarchar(50) NOT NULL,
        other_a nvarchar(20) NOT NULL
    );
    
    CREATE TABLE dbo.TableB
    (
        id int NOT NULL,
        category_name nvarchar(50) NOT NULL,
        other_b nvarchar(20) NOT NULL
    );
    
    INSERT INTO dbo.TableA (id, category_name, other_a)
        VALUES (1, N'Alpha', N'ppp'),
            (2, N'Bravo', N'qqq'),
            (3, N'Charlie', N'rrr');
    
    INSERT INTO dbo.TableB (id, category_name, other_b)
        VALUES (4, N'Delta', N'sss'),
            (5, N'Echo', N'ttt'),
            (6, N'Foxtrot', N'uuu');
    

    创建 TableC 以接收结果集。请注意,other_a 和 other_b 列允许空值。

    CREATE TABLE dbo.TableC
    (
        id int NOT NULL,
        category_name nvarchar(50) NOT NULL,
        other_a nvarchar(20) NULL,
        other_b nvarchar(20) NULL
    );
    

    将组合的行集插入 TableC:

    INSERT INTO dbo.TableC (id, category_name, other_a, other_b)
        SELECT id, category_name, other_a, NULL AS 'other_b'
            FROM dbo.TableA
        UNION ALL
        SELECT id, category_name, NULL, other_b
            FROM dbo.TableB;
    

    显示结果:

    SELECT *
        FROM dbo.TableC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多