【发布时间】:2012-09-23 09:26:24
【问题描述】:
给定三个表 Ta、Tb、Tc:
Ta(ID, Field1)
Tb(ID, Field2)
Tc(ID, Field3)
给定数据示例:
Ta
ID Field1
---------
1 A
1 B
Tb
ID Field2
---------
1 C
1 D
2 E
Tc
ID Field3
---------
1 F
2 G
2 H
问题: 如何加入这些数据以返回:
ID Field1 Field2 Field3
-----------------------
1 A C F
1 B D NULL
2 NULL E G
2 NULL NULL H
我认为我可以通过外部连接来实现这一点,但似乎并非如此。分组的顺序并不重要,只要我带回没有重复行的所有信息即可。
只是为了澄清。只要结果集以最少的行数返回所有数据,我并不介意我得到哪种组合。这是我正在尝试做的一个更现实的例子:
给定一个人,叫他约翰。他有两个电话号码和三个电子邮件地址:
PID Email
---------
John john@test.com
John john@mail.com
John john@john.com
PID Tel
--------
John 011
John 022
我想回来:
PID Email Tel
----------------------
John john@test.com 011
John john@mail.com 022
John john@john.com NULL
【问题讨论】:
-
为什么最后一行分配给ID = 3?
-
1 A D F怎么样?还有1 B C F?为什么不归还那些,它们显然在你的归还中丢失了,不是吗?在你回应之前,停下来思考一下,也许你会意识到你的需求的真正问题...... -
您的组合似乎取决于原始表中行的顺序。在 SQL(和 SQL Server)中,未指定表中行的顺序。您是否有用于确定排序的行号或标识列或日期或其他内容?
-
“我不在乎我是否得到
2 NULL E H和2 NULL NULL G或2NULL E G和2 NULL NULL H”。我想我需要更多的咖啡,因为我完全被这个要求弄糊涂了。 -
@LittleBobbyTables。这是一个数据提取。我只需要在尽可能少的行中查看相关数据。它们的排序方式无关紧要。除了 ID 之外,它们是无关的。
标签: sql sql-server outer-join