【问题标题】:Find unmatched between 2 tables using field as selection criteria使用字段作为选择条件查找 2 个表之间的不匹配
【发布时间】:2021-01-21 05:50:28
【问题描述】:

我以下面的表格为例。

表 1

EmpID LastName FirstName
1 Smith John
2 Jones Bob
3 Citizen Jane

表 2

EmpID ReqID ReqDesc
1 1 Car
1 2 Diploma
1 3 Phone
2 1 Car
2 3 Phone
3 1 Car
3 2 Diploma
3 3 Phone

我想返回表 1 中没有表 2 中没有文凭的条目的所有记录,例如 ReqID = 2

此查询将所有记录返回给我,但不仅仅是 Bob Jones 的记录。因为他们有其他记录,ReqID 2. 有没有办法对他们进行分组来实现这一点?

SELECT Table1.EMPID,
FROM Table1 LEFT JOIN Table2 ON Table1.EMPID = Table2.EMPID
WHERE Table2.ReqID <> 2;

【问题讨论】:

    标签: sql tsql


    【解决方案1】:
    SELECT Table1.EmpID
    FROM Table1
    WHERE NOT EXISTS  (SELECT 1 FROM Table2 WHERE Table2.EMPID = Table1.EmpID AND Table2.ReqID = 2)
    

    【讨论】:

      【解决方案2】:

      使用exists:

      SELECT t1.*,
        FROM Table1 t1
       WHERE NOT EXISTS 
            (select 1 from Table2 t2 
              where t1.EMPID = T2.EMPID and t2.reqdesc = 'Diploma');
      

      【讨论】:

      • 这将返回有文凭值的行,OP想要没有值的地方
      • @MartinCairney 请仔细阅读 - I want to return all records from Table 1 that don't have an entry in Table 2 that don't have a Diploma
      • OP 认为只有 Bob Jones 的记录应该回来。他是唯一一个没有文凭条目的人 - 因此不存在。那句话中的双重否定确实使它不清楚
      • 让 OP 带着他的评论回来。这可以使用NOT EXISTS 而不是EXISTS 来实现
      • 以上查询返回表 2 中与“Diploma”匹配的记录。将EXISTS 更改为NOT EXISTS 将返回正确的数据,其中返回所有没有“Diploma”的记录。
      猜你喜欢
      • 2011-03-18
      • 2015-02-09
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      相关资源
      最近更新 更多