在MS Access中,我正在尝试搜索匹配的记录,以便我只看到表1中与表2中匹配的记录。无论我尝试什么,我最终都会在结果中获得更多记录设置比表1必须开始。我试过内联,左联......我不知道我做错了什么。
我只想要表1中与表2中匹配的记录。
表1有294,037条记录
当我跑步时:
Select Table1.Key
From Table1
Inner Join Table2
On Table1.Key = Table.Key;
我的结果集有4,428,853条记录。
答案 0 :(得分:1)
如果只希望Table1中的匹配记录与table2的匹配记录,则使用exists
或in
子句获取所需的输出。以下是获得输出的相同
Select T1.Key From Table1 T1 where
exists (select 1 from Table2 T2 where T1.Key = T2.Key);
答案 1 :(得分:0)
除非你想要在右侧有一行但在左侧没有匹配的行(那将是RIGHT JOIN
)的行的NULL值,听起来你想要一个'INNER JOIN' 。但是,如果JOIN
条件匹配多行,您将在结果中获得多行。以下是它的工作原理:
INNER JOIN
之前指定的表)INNER JOIN
后指定的表)ON
之后指定)匹配每一侧的行,如果来自任意一方的单行数据多次出现在结果中,则只能是因为JOIN
(ON
子句之后的条件)所使用的标准导致一侧有多行,另一侧有一行或多行。
例如,如果我有以下两个表:
Table1 | Key | Value
------ | --- | -----
| 1 | A1
| 1 | A2
| 2 | B
| 3 | C
| 5 | E
Table2 | Key | Value
------ | --- | -----
| 1 | Z
| 2 | Y
| 3 | X1
| 3 | X2
| 4 | W
以下查询:
SELECT * FROM Table1 first
RIGHT JOIN Table2 second ON first.Key=second.Key
将返回以下结果:
Table2 | Key | Value | Key | Value
------ | --- | ----- | --- | -----
| 1 | A1 | 1 | Z
| 1 | A2 | 1 | Z
| 2 | B | 2 | Y
| 3 | C | 3 | X1
| 3 | C | 3 | X2
|NULL | NULL | 4 | W
请注意,Table2中的1,Z行在结果中出现两次,而来自A的3,C行也出现两次。 4,W出现,因为它是RIGHT JOIN
。 LEFT JOIN
会在结果中放置5,E,而INNER JOIN
(或只是普通JOIN
)将不会包含这些行。 OUTER JOIN
将包含这两行。
如果Table2有两个带有Key 1的条目(假设是Z1和Z2),那么Key为1的四个结果(一个带有A1,Z1,一个有A2,Z1,一个有A1,Z2和一个有A2,Z2)。这是事情真正起泡的地方,根据你的数字,看起来你可能有几个关键值,在这种情况下。
如果Table1和Table2中的值都具有相同的键值,则结果集将包含每个可能的值组合,因此结果集中的行数将是Table1 次<中的行数/ em> Table2中的行数。
WHERE
子句中的限制也可能会修剪与那里指定的所有条件都不匹配的结果行。
对于INNER JOIN
,除非上面的步骤4中存在多个匹配项,否则结果集中的行数将少于源表中的较小行。如果要确保只有一个匹配项,则必须为两个表都使用唯一键(只有一行包含任意给定键的键),必须更改ON
条件以将匹配限制为一个行,或者您必须过滤JOIN
的一侧,使其仅包含您要加入的行。