在查询中使用两个表时的SQL奇怪之处
一位同事正在为他设置的两个表创建查询——英国时间和埃及时间。他的查询的SQL如下所示:在查询中使用两个表时的SQL奇怪之处,sql,ms-access,Sql,Ms Access,一位同事正在为他设置的两个表创建查询——英国时间和埃及时间。他的查询的SQL如下所示: SELECT Sum([UK Time].[Hours Booked]), [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month] FROM [UK Time], [Egypt Time] GROUP BY [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month
SELECT Sum([UK Time].[Hours Booked]), [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month]
FROM [UK Time], [Egypt Time]
GROUP BY [UK Time].[First Name], [UK Time].[Last Name], [UK Time].[Month]
HAVING (([UK Time].[First Name])="Geoff"), ([UK Time].[Month])="September 2009"));
英国《时代》杂志有18个结果与“杰夫”和“2009年9月”相匹配,埃及《时代》杂志共有6022个条目。英国《时代》杂志的总条目数与之类似
运行此查询时,它将返回18个结果,但每个结果重复6022次,在查询中总共提供108396个条目。当从查询中删除埃及时间时,它只显示18个结果
我的同事现在只创建了两个查询,每个表一个查询,但我希望这里的人能够解释这种行为。好吧,你没有告诉它如何将两个表连接在一起,所以它执行笛卡尔连接,将每一行与每一行连接在一起
Google Internal Join查看一些关于如何执行此操作的示例。好吧,您还没有告诉它如何将两个表连接在一起,因此它执行笛卡尔连接,将每一行与每一行连接起来
Google Inner Join查看一些关于如何做到这一点的示例,以扩展Kevin的答案: 笛卡尔或完全外部联接基本上给出了表的乘积,左表中每一行的结果集中的一行与右表中的每一行匹配 这有它的用途,但它们是罕见的 你想做点什么
...
FROM LeftTable
INNER JOIN RightTable ON LeftTable.Key = RightTable.Key
WHERE ...
这将只提供两个表之间匹配的记录。要扩展Kevin的答案: 笛卡尔或完全外部联接基本上给出了表的乘积,左表中每一行的结果集中的一行与右表中的每一行匹配 这有它的用途,但它们是罕见的 你想做点什么
...
FROM LeftTable
INNER JOIN RightTable ON LeftTable.Key = RightTable.Key
WHERE ...
这将只提供两个表之间匹配的记录。您没有提到要实现的结果,但我相信您需要使用UNION: 目前,正如Kevin Ross和JNK所解释的,您得到的是笛卡尔积:
始终返回tablea中的行乘以tableb中的行您没有提到您试图实现的结果,但我相信您需要使用UNION: 目前,正如Kevin Ross和JNK所解释的,您得到的是笛卡尔积: 始终返回表A中的行乘以表B中的行
SELECT * FROM tablea, tableb