我一直在使用先前关于子查询的问题给出的建议。见这里:
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);
答案 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
但是你的不存在有一个不同的子查询。此外,您的一些错误可能是由于多次使用相同的别名造成的。
最后,彼得的方法应该有效。我没有查看详细信息。