这是我的模式的简化版本。使用Sql Server 2012企业版。
CREATE table #abc (a INT , b INT);
CREATE TABLE #def ( a INT , c INT ,d INT);
INSERT INTO #abc values(1,23),(1,24);
INSERT INTO #def VALUES(1,53,54),(1,56,57)
表#abc加入#def ON COLUMN a
基本上,它是基于a列的两个表中的行的串联。尝试过内部联接\交叉应用,但它们都会产生交叉联接类型的结果集,这是可以理解的。我有使用另一个临时表(然后更新)的解决方法,但有点觉得这可以在单选中轻松完成。我错过了一些简单的东西。
需要这样的输出:
a b c d
1 23 53 54
1 24 56 57
谢谢
-N
您需要某种序列号来将表连接在一起。您可以使用row_number()
生成一个,如下所示:
select a.a, a.b, d.c, d.d
from (select a.*, row_number() over (order by (select NULL)) as seqnum
from #abc a
) a join
(select d.*, row_number() over (order by (select NULL)) as seqnum
from #def d
) d
on a.seqnum = d.seqnum;
现在小心,小心,小心。order by
子句并没有真正指定排序,因此序列号可能不是您所期望的。您确实应该有一个列来指定排序。
您需要在每一行中都有一个唯一的键值,才能以您想要的方式连接表。然后,内部联接将返回所需的结果集。
如果在表之间引入引用完整性,那么这将被强制执行并返回预期的结果。