我是用下面的问题今天在接受采访时命中:SQL SELECT语句专访查询
多少行将下面的SQL语句返回给出的两个 表A和B,其中A和B各已经整整10行?:
我的答案是明显的:20。但是,我的面试官告诉我,这是涉嫌100,但他说,他不买自己。任何人都可以对此有所了解吗?
我是用下面的问题今天在接受采访时命中:SQL SELECT语句专访查询
多少行将下面的SQL语句返回给出的两个 表A和B,其中A和B各已经整整10行?:
我的答案是明显的:20。但是,我的面试官告诉我,这是涉嫌100,但他说,他不买自己。任何人都可以对此有所了解吗?
该查询返回表A
和B
的笛卡尔乘积。表A中的每一行都将与表B中的每一行匹配。10行* 10行= 100行。
你很可能解释,作为一个UNION
,其中表B中的所有行追加到行底部从表A.该查询应该是这样的:
SELECT * FROM A
UNION
SELECT * FROM B
注意这只有在A
和B
的结构相同的情况下才有效。
这是一个笛卡儿连接。在一个所有行会B中被加入到每一行,导致输出100行:
A1, B1
A1, B2
A1, B3
. . .
A2, B1
A2, B2
A2, B3,
. . .
A10, B8
A10, B9
A10, B10
如果您不应用选择两个表中的任何再加入数据库会自动考虑笛卡尔乘积作为默认的联接。所以你将有100行作为你的结果集。
这相当于在T-SQL中使用CROSS JOIN,因此您将得到一个笛卡尔积,因为您没有ON子句来关联这些表,并且您没有要过滤的WHERE子句结果。见http://msdn.microsoft.com/en-us/library/ms190690(v=sql.105).aspx。
当您不使用任何连接条件时,SQL将执行笛卡尔积并且第一个表的每一行都将映射到第二个表的每一行。
您将得到记录为:
table1row1 table2row1
table1row1 table2row2
table1row1 table2row3
........
........
table1row2 table2row1
.....
and so on
.....
table1row10 table2row10
因此,你会得到100条记录。