SQL如何连接2个表,以便仅显示表2中的匹配记录

时间:2017-09-17 01:42:19

标签: sql ms-access join

在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条记录。

2 个答案:

答案 0 :(得分:1)

如果只希望Table1中的匹配记录与table2的匹配记录,则使用existsin子句获取所需的输出。以下是获得输出的相同

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条件匹配多行,您将在结果中获得多行。以下是它的工作原理:

  1. 查找左侧的内容(查询中INNER JOIN之前指定的表)
  2. 找到右侧的内容(查询中INNER JOIN后指定的表)
  3. 接下来,根据指定的条件(在ON之后指定)匹配每一侧的行,
  4. 如果,对于左侧的一个匹配行,右侧有一个匹配行,请将左侧行的列值与列值相对应从右表到结果中的一行
  5. 如果两边都有多个匹配行,请复制每一行的每一行,使结果具有所有可能的匹配组合,并将它们放入结果中。
  6. 如果来自任意一方的单行数据多次出现在结果中,则只能是因为JOINON子句之后的条件)所使用的标准导致一侧有多行,另一侧有一行或多行。

    例如,如果我有以下两个表:

    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 JOINLEFT 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的一侧,使其仅包含您要加入的行。