【问题标题】:Sql Query help to get non matching records from two tablesSql Query 帮助从两个表中获取不匹配的记录
【发布时间】:2011-08-15 23:05:15
【问题描述】:

我正在尝试从 2 个表中获取不匹配的记录

TableA
 ID           Account
 1               Acc1
 2               Acc2
 3               Acc3

 TableB
 Opp          Accountid
 Opp1            1
 Opp2            2
 Opp3            4

我需要知道 TableB 中存在哪个 accountid,但 TableA 中没有。如果有人能提供这个查询,那就太好了。

需要的记录是tableB的Opp3

谢谢

普雷迪

【问题讨论】:

    标签: sql tsql sql-server-2008


    【解决方案1】:

    这将产生相同的结果。

    select * from TableB where Accountid not in (select ID from TableA)
    

    【讨论】:

    • 用什么生成相同的结果。请澄清,因为你的答案在没有上下文的情况下很混乱
    • 抱歉回复晚了。根据AccountId(属于TableB)和ID(属于TableA),这将就像您只想从TableB获取TableA中不存在的那些记录一样
    【解决方案2】:
    SELECT B.Accountid 
      FROM TableB AS B 
      LEFT 
      JOIN TableA AS A 
        ON A.ID = B.Accountid 
     WHERE A.ID IS NULL;
    

    LEFT JOIN 意味着它从第一个表中获取所有行 - 如果第一个连接条件没有匹配项,则表 B 的结果表列将为空 - 这就是它起作用的原因。

    【讨论】:

    • 我想你的意思是LEFT OUTER JOIN
    • OUTER 是标准但可选的关键字。
    • 添加外连接有什么不同吗?
    • OUTER 自 2000 年以来在 SQL Server 中已被弃用。大学教授仍然喜欢它,但 SQL Server 查询优化器意味着 OUTER、INNER 和 RIGHT 关键字根本不再需要。 JOIN 表示 INNER,LEFT JOIN 表示 OUTER。
    • 大卫,查询有问题.. 我没有得到正确的结果。如果您使用下面 Nighil 给出的数据。我得到一、二和四的结果
    【解决方案3】:
    SELECT B.Accountid
    FROM TableB AS B 
    LEFT JOIN TableA AS A ON A.ID = B.Accountid 
    WHERE A.ID IS NULL
    

    【讨论】:

    • 这与 David Fells 给出的答案完全相同。
    • @mrt 实际上不是。由于缺少 where 关键字,David Fells 的答案不起作用。
    【解决方案4】:

    试试这个

    (select * from t1
    except 
    select * from t2)
    
    union
    
    (select * from t2
    except 
    select * from t1)
    

    认为您在两个表中的列数相同

    上面提到的查询从#two 中选择ID 除了从#one 中选择ID 只会给你不匹配的行 #two 。它会忽略#one

    【讨论】:

      【解决方案5】:
      create table #one (id int,acc nvarchar(25))
      insert into #one (id , acc) values(1,'one') 
      insert into #one (id , acc) values(2,'two') 
      insert into #one (id , acc) values(3,'three') 
      
      create table #two (acct nvarchar(25),ids int)
      insert into #two (acct,ids) values('one',1) 
      insert into #two (acct,ids) values('two',3) 
      insert into #two (acct,ids) values('four',4) 
      
      select ids from #two EXCEPT select id from #one 
      
      drop table #one 
      drop table #two 
      

      测试这个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        相关资源
        最近更新 更多