2014-03-04 50 views
0

這是使用SQL Server 2012.SQL內部加入,然後左加入3表

我想使用內部連接和左加入3表。

計劃是:

  • 採取從表S =的行的列表,
  • 通過s.pid = v.pid和v.pro = 'p' 和s.reg =對應於表V 'u',它能v.categoryid = 8
  • 然後,有一個處理的日誌(表L),
  • 通過L.pid = v.pid和L.pro = v.pro
對應於表V

我想找到那個不是exi的集合表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' 

這將返回什麼...

請幫

+0

'SELECT TOP ...' - 這是SQL Server的?我建議添加適當的數據庫技術標籤。 – ChicagoRedSox

+0

@ChicagoRedSox可能是MsSQL。我以爲我不知道'top'是否存在,但我會認爲OP知道SQL有點。 – Sebastien

+0

@Sebastien - 在MySQL中,查詢結束時是「SELECT ... LIMIT X」。 – ChicagoRedSox

回答

0

如果left join一個表,然後過濾它的列不等於空值,它會在影響過濾掉該表上的null值,包括未進行連接的情況。

您將需要處理空值以防止發生這種情況。例如,你會改變

and L.pro='p' 

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

或者更簡單地說

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

你是對的!如果我只是刪除「和L.pro ='p'」它的作品!謝謝 –