我有两张桌子:
Table1
[ID] [Number]
1 40
2 100
3 7
和
Table2
[ID] [Number] [Name]
1 40 A
3 7 C
数据源自表 1,然后在完成某些过程后复制到表 2(并添加名称)。我尝试将SELECT
表 1 中的所有内容复制到表 2 中,同时显示表 2 中的“名称”字段(如果存在)。如果“名称”字段不存在(或者更准确地说,如果 ID 尚不存在于表 2 中),我想将该字段留空。
期望输出:
[ID] [Number] [Name]
1 40 A
2 100
3 7 C
试图:
SELECT Table1.ID,Table1.Number,Table2.Name
WHERE Table1.ID=Table2.ID
我目前的尝试完全被忽略了,[ID] 2
因为我尝试的语句是在两个表中查找 ID,但只在 Table1 中找到它。我猜我可能需要使用COALESCE
、ISNULL
或JOIN
,所有这些对我来说都是陌生的。这些(或许多的组合)中的任何一个都是适合这项工作的工具吗?有没有办法让我只在字段存在时包含它Name
,否则将其留空?
答案1
为了达到您想要的结果,您必须使用外连接(自 Oracle 9i 起语法有效中的示例):
SELECT
Table1.ID,
Table1.Number,
Table2.Name
FROM Table1
OUTER JOIN Table2
ON Table1.ID = Table2.ID
更新
进一步解释一下(正如 duDE 所提到的):
问题中使用的连接称为等连接,这意味着只Table1
选择中的行,并且也存在于中Table2
(反之亦然)。
外连接选择 中包含的所有行Table1
,并连接 中的所有匹配行Table2
。如果Table2
不包含匹配行,则null
返回所有列的 。