【问题标题】:How to find missing rows in second table from first table in my case? [closed]在我的情况下,如何从第一个表中找到第二个表中丢失的行? [关闭]
【发布时间】:2016-04-24 17:35:58
【问题描述】:

我有两张桌子。

表 1:第一

--------------------------
|  iso          | WeldNo |
--------------------------
| AMD-11201-01  |     02 |
| RFG-11203-01  |     01 |
| AMD-11201-01  |     03 |
| RFG-11203-01  |     05 |

表 2:第二个

--------------------------
|  iso          | WeldNo |
--------------------------
| AMD-11201-01  |     02 |
| RFG-11203-01  |     01 |
| RFG-11203-01  |     05 |

预期结果:

--------------------------
|  iso          | WeldNo |
--------------------------
| AMD-11201-01  |     03 |

我试过查询,但不工作

select a.iso, a.WeldNo 
from first a 
where a.WeldNo, a.iso not in (select b.iso,b.WeldNo from second b);

请为我的方案提供解决方案

【问题讨论】:

  • 那么您使用的是 MySQL 还是 SQL Server?
  • 您的查询几乎已准备就绪。用.. where (a.iso, a.WeldNo) not in ..修复它(这是给MySQL的。不知道它是否适用于sql-server)。
  • 我第二个dotnetom的问题。您对一般 SQL、MySQL 或 SQL Server 有什么要求?您真的不应该同时标记 mysql 和 sql-server ,除非您正在谈论在它们之间移植数据库或其他东西。因此,如果是通用 SQL,请同时删除 MySQL 和 sql-server。如果是关于特定数据库的选择。

标签: mysql sql sql-server database


【解决方案1】:

从问题上的标签来看,不清楚您使用的是哪个 RDBMS。如果你使用的是 SQL Server,你可以使用EXCEPT:

select a.iso, a.WeldNo 
from first a 

EXCEPT

select b.iso, b.WeldNo 
from second b

这会选择 SELECT 语句中的所有项目,但在第二个 SELECT 语句中找到的项目除外。

如果您使用的是 MySQL,您可以稍微修正您的查询(即添加括号),您应该会得到一个有效的查询:

select a.iso, a.WeldNo 
from first a 
where (a.WeldNo, a.iso) not in (select b.WeldNo, b.iso from second b)

【讨论】:

  • 您的列顺序在第二个查询中是不同的。 a.WeldNo, a.isob.iso,b.WeldNo.
  • @PaulSpiegel 感谢您的关注,已修复
  • 这里没有任何查询。
  • @user3041016 你收到错误了吗?出乎意料的结果?是不是有其他东西不起作用?
【解决方案2】:
select f.*
from first_table f
left join second_table s on s.iso = f.iso
                        and s.WeldNo = f.WeldNo 
where s.iso is null

另见this great explanation of joins

【讨论】:

    【解决方案3】:

    您可以使用LEFT JOINEXCEPT

    左加入:

    SELECT t1.iso, t1.WeldNo
    FROM Table1 t1 
    LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
    WHERE t2.iso IS NULL
    

    除外:

    SELECT iso, WeldNo
    FROM Table1
    EXECEPT
    SELECT iso, WeldNo
    FROM Table2
    

    不过还是有一些区别。在 except 的情况下,两个结果必须具有相同的列,而 LEFT JOIN 允许您指定从每个表中选择的内容。此外,在大多数情况下,LEFT JOIN 的性能会更高,因为它得到了更好的优化。但是,EXCEPT 只会从第一个查询中返回第二个查询中缺少的 unique 行,因此它可能更适用于这种情况。当然,您可以在第一个查询中添加DISTINCT 以获得类似结果:

    SELECT DISTINCT t1.iso, t1.WeldNo
    FROM Table1 t1 
    LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
    WHERE t2.iso IS NULL
    

    话虽如此,使用LEFT JOIN 可能会更好,但它可能因您的数据库而异。

    【讨论】:

      【解决方案4】:

      我会使用not exists,因为它清楚地表达了意图,即“从 table1 中选择所有行,其中 table2 中具有相同 iso 和 WeldNo 的行不存在”

      select * from table1 t1
      where not exists (
          select 1 from table2 t2
          where t2.iso = t1.iso
          and t2.WeldNo = t1.WeldNo
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        相关资源
        最近更新 更多