sql - 与相关子查询混淆

时间:2013-04-20 20:50:11

标签: sql subquery

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

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);

2 个答案:

答案 0 :(得分:2)

这样做会产生差异:

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

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

答案 1 :(得分:1)

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

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

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

最后,彼得的方法应该有效。我没有查看详细信息。