我正在使用SQL Server 2012并希望查询以下内容:
我有两张大多数不同列的表格。 (1个表有10列,另一个有6列)。 但是它们都包含一个ID号列和另一列category_name。
现在我希望有一个包含两个表的所有行的表,只有一个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;
有关正确完成方法的任何建议吗?
答案 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;