如何将两个表连接在一起并返回两个表中的所有行,并将它们的一些列合并为一个列

时间:2016-04-28 13:56:57

标签: sql sql-server database join

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

我有两张大多数不同列的表格。 (1个表有10列,另一个有6列)。 但是它们都包含一个ID号列和另一列category_name。

  1. 表格之间的ID号码可能重叠(例如,1个表格可能有200个不同的ID,另外900个,但两个ID中只有120个)。
  2. 每个表的类别名称都不同且唯一。
  3. 现在我希望有一个包含两个表的所有行的表,只有一个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;
    

    有关正确完成方法的任何建议吗?

3 个答案:

答案 0 :(得分:1)

制作FULL JOIN ON 1=0

这将阻止行组合,并确保始终从每个表中获取每行的1份副本。

进一步解释:

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

你想要一个完全连接,你从不组合行,因为你希望两个表中的每一行都出现一次,无论如何。 1永远不能等于0,所以在1 = 0上执行FULL JOIN会给你一个完全连接,其中没有一行是相互匹配的。

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

答案 1 :(得分:0)

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

UNION ALL

SELECT ID,Category_name,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,(其他4列) 从t2

答案 2 :(得分:0)

这演示了如何使用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;

enter image description here

相关问题