SQL Inner Join然后离开Join 3表

时间:2014-03-04 23:38:56

标签: sql join sql-server-2012 left-join inner-join

这是使用SQL Server 2012。

我想使用内连接,并使用3个表左连接。

计划是:

  • 从表S中获取行列表
  • 对应于表格v,s.pid = v.pid和v.pro ='p'和s.reg ='u',其中v.categoryid = 8
  • 然后,有一个已处理的日志(表L),
  • 通过L.pid = v.pid和L.pro = v.pro
  • 对应于表V.

我想找到表L中不存在的集合,表示之前没有处理过。

我写道:

select top 100 
    s.* 
from   
    S
inner join 
    V on s.pid = v.pid
left join 
    L on L.pid = v.pid and L.pro = v.pid
where 
    s.reg = 'u'
    and v.pro = 'p'
    and v.categoryid = 8 
    and L.pid is null
    and L.pro = 'p'

这不会返回任何内容......

请帮忙

1 个答案:

答案 0 :(得分:0)

如果你left join一个表,然后将它的列过滤为等于非空值,它实际上会过滤掉该表上的null值,包括未进行连接的情况。

您需要处理空值以防止这种情况发生。例如,你会改变

and L.pro='p'

and (L.pro IS NULL OR L.pro='p')

或更简单

and ISNULL(L.pro, 'p') = 'p'