场景中各种联接的结果

时间:2019-03-28 12:14:13

标签: sql-server

我有两个表test1和test2,每个表都包含一些值。

我已经应用了内部和外部联接,但是对输出感到困惑。

Create table test1
( id int)
insert into test1 values (1)
insert into test1 values (1)
insert into test1 values (1)


Create table test2
( id int)
insert into test2 values (1)
insert into test2 values (1)
insert into test2 values (NULL)

select a.id from test1 a inner join test2 b on a.id = b.id

我期待中,

1
1
Null

作为内部联接,左联接和右联接的输出。

但是原始输出是

1
1
1
1
1
1

您能帮助我理解所有联接上的内容吗?

1 个答案:

答案 0 :(得分:1)

test1中三个1的每个与test2中两个1的每个连接,这产生了您在结果集中得到的3x2 = 6行。 test1中的第一个,第二个和第三个1之间没有什么不同,test2中的第一个和第二个1之间没有什么不同。

此外,请记住以下所有条件:

NULL = 1
NULL <> 1
NULL = NULL
NULL <> NULL

是错误的。一侧为NULL的 All 条件将评估为false。这是因为NULL代表未知值。

如您所见,您所期望的完全错误。看来您希望test1的第一行与test2的第一行连接在一起,依此类推。 sql中没有这样的“魔术”-连接的整个逻辑都放在ON子句中,该子句按前面的解释连接了1。