在查询中使用两个表时的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

一位同事正在为他设置的两个表创建查询——英国时间和埃及时间。他的查询的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] 
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