【问题标题】:sql - confusion with correlated subqueriessql - 与相关子查询混淆
【发布时间】:2013-04-21 05:13:29
【问题描述】:

我一直在使用之前关于子查询的问题中给我的建议。见这里:

sql - multiple layers of correlated subqueries

SQL Server : left join results in fewer rows than in left table

我使用的是 ms sql server(我相信是 2005 年的)。

我现在要做的是:

我有一个行结果(称为结果 A),它是通过执行以下操作获得的:

select * from TableA as a
join (select * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b
on a.id = b.id

在此结果中,我想查找所有不在此查询返回的行的结果中的行:

select * from TableA as a
join TableC as c
on c.id = a.id

基本上我的情况是第一个查询产生 246 条记录,而第二个查询产生 247 条记录。我期待第一个结果返回 247 条记录(所有这些都应该在第二个查询返回的记录列表中)。所以现在我需要调查丢失了哪条记录,以便采取适当的措施。

我尝试执行以下操作,但收到各种错误:

select * from (select * from TableA as a
join (select * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b
on a.ul_id = b.id))
as result_A
where not exists (select 1 from (select * from TableA as a
                  join TableC as c
                  on c.id = a.ul_id) as result_B
                  where result_A.ul_id = result_B.id);

【问题讨论】:

    标签: sql subquery


    【解决方案1】:

    做这个设置差异:

    select a.* from TableA as a
    join TableC as c
    on c.id = a.id
    
    except
    
    select a.* from TableA as a
    join (select * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b
    on a.id = b.id
    

    如果由于某种原因没有返回一行,那么第一个查询有重复。

    【讨论】:

      【解决方案2】:

      您的叙述说您要排除以下结果:

      select * from TableA as a
      join TableC as c
      on c.id = a.id
      

      但你的 not exists 有不同的子查询。此外,您的某些错误可能是由于多次使用同一个别名造成的。

      最后,Pieter 的方法应该奏效了。详情我没查。

      【讨论】:

        猜你喜欢
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-02
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多