2016-01-21 105 views
0

在編寫SQL Server的SQL查詢時需要一些幫助。我有以下的數據模型三個用表SQL Server - 內部和外部連接在一起

表1

Seq ID Name 
1 1234 Abc 
2 4567 Pqr 
3 7890 Xyz 

表2

Seq Table1Id Table3Seq 
1 1234  1 
2 1234  2 
3 7890  3 

表3

Seq Status 
1 Rejected 
2 Accepted 
3 Pending 

我的要求是類似下面。如果存在,我希望將表1中的所有記錄與表3中的最新狀態一起存儲。所以,正如我們可以看到Id 1234,有兩個記錄匹配表3(通過表2),但是我想要接受的最新。但是表1中的記錄4567在表2中沒有任何記錄,所以我可以對狀態顯示爲空。

Number Name  Status 
1234  Abc  Accepted 
4567  Pqr  
7890  Xyz  Pending 

我想,我們可能需要使用外部和內部連接在一起,但是到目前爲止,我無法找到合適的查詢。當我嘗試使用MAX使用外連接時,它仍然給我兩條記錄,分別對應1234,當我使用內連接時,則輸出中沒有記錄4567

+1

您嘗試過哪些查詢? –

+0

你現在如何1234的第二個記錄是最新的?有日期時間字段或什麼? –

+0

Hi @ haytem,表3中較高序列號的值假定爲最新值。 – vnkotak

回答

2
select a.ID, a.Name, c.Status 
from table1 a 
left outer join (select max(b.seq) AS SEQ, b.table1id from table2 b group by b.table1id) t2 on a.id = t2.table1id 
left outer join table2 t2b on t2.seq = t2b.seq and t2.table1id = t2b.table1id 
left outer join table3 c on t2b.table3seq = c.seq 

有可能是更有效的方法來做到這一點,但這會給你你後面的結果。基本上將表1連接到表2的子集,獲得每條記錄的最大序列,然後再次連接到表2以獲取表3的鏈接,然後連接到表3以獲取狀態。

所有連接都留在外面,所以你得到你的pqr結果返回null狀態。

+0

感謝隊友的快速幫助。我的問題解決了。我實際上也嘗試過使用MAX(),但不幸的是,我錯過了GROUP BY子句.. :) – vnkotak

0

使用兩個連接:

在SQL Server這樣做是利用 outer apply
SELECT Number, Name, Status FROM 
     (SELECT Table1.ID AS Number, Table1.Name, Table3.Status, 
     ROW_NUMBER() OVER (PARTITION BY Table1.Number ORDER BY table3.Seq DESC) AS RN 
     FROM Table1 
     LEFT OUTER JOIN Table2 ON Table1.ID=Table2.Table1ID 
     LEFT OUTER JOIN Table3 ON Table3.seq=table2.Table3Seq)MyTable 
     WHERE MyTable.RN=1 
0

的一種方式。這種方法往往具有最佳性能:

select t1.*, t3.status 
from table1 t1 outer apply 
    (select top 1 t3.* 
     from table2 t2 join 
      table3 t3 
      on t2.table3seq = t3.seq 
     where t1.id = t2.table1id 
     order by t2.id desc 
    ) t3; 

相應的索引是table2(table1id, table3seq, id)table3(seq, status)

+0

謝謝@Gordon ..也會試試這個,看看能否給我期望的輸出帶來更好的性能。 – vnkotak