【问题标题】:Discrepance obtaining values not in inner join by difference通过差异获得不在内部连接中的值的差异
【发布时间】:2013-05-03 21:39:47
【问题描述】:

我有表 A 和表 B。我知道表 B 有 7848 行 (count(*)),我想看看表 A 中存在哪 7848 行。据我所知,INNER JOIN 返回出现在两个表 A 和 B。所以我像这样在内部加入它们:

SELECT *
 FROM 
  TABLE1 AS A
 INNER JOIN 
  TABLE2 AS B
 ON A.field1 = B.field1

此查询返回 1902 行。现在,我想找出哪些行没有出现在表 B 中,所以我这样做:

SELECT * FROM TABLE_B WHERE FIELD1 NOT IN (field1*1902....);

不同的是,我认为我应该得到 5946 行的结果,因为我发现了 1902 行。奇怪的是,这个 NOT IN 语句返回 6175 行,如果我添加它们,我会得到 8077,这比 count(*) 告诉我的表 B 多。

我可能做错了什么?

提前致谢。

【问题讨论】:

    标签: mysql sql inner-join


    【解决方案1】:

    连接是一种乘法。如果表 A 中有多行具有相同的 field1,则 B 中的行会被计算多次。

    也许你想要

    SELECT * FROM TABLE_B B
    WHERE EXISTS (SELECT field1 from TABLE_A A WHERE A.field1 = B.field1);
    

    【讨论】:

      【解决方案2】:

      试试:

      SELECT *
       FROM 
        TABLE1 AS A
       LEFT JOIN 
        TABLE2 AS B
       ON A.field1 = B.field1
       WHERE B.field1 IS NULL
      

      【讨论】:

        【解决方案3】:

        以下查询返回表 A 中不在表 B 上的行:

        SELECT * FROM TABLE1 WHERE field1 NOT IN (SELECT field1 FROM TABLE2)
        

        您还可以摆脱 IN 条件以获得更好的性能:

        SELECT * FROM TABLE1 A WHERE NOT EXISTS (SELECT 1 FROM TABLE2 B WHERE B.field1 = A.field1)
        

        【讨论】:

          【解决方案4】:

          您可能在表 1 中有一些重复值,这些值也出现在表 2 中。您的第一个查询将多次返回这些记录。

          如果您有空值,您还需要小心:INNER JOIN 和 NOT IN 不会返回这些值。

          【讨论】:

            猜你喜欢
            • 2014-05-20
            • 1970-01-01
            • 2019-06-12
            • 1970-01-01
            • 1970-01-01
            • 2010-09-29
            • 2019-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多