2014-12-12 20 views
0

我在我的MS SQL數據庫中有一個名爲PolicyTransactions的表。此表有兩個重要的列:SELF引用SQL查詢

trans_id INT IDENTITY(1,1), 
policy_id INT NOT NULL, 

我需要幫助寫一個查詢,將用於表中的每個TRANS_ID/policy_id,其加入前次的TRANS_ID爲policy_id。這似乎是一個足夠簡單的查詢,但由於某種原因,我現在無法在我的大腦中獲得凝膠。

謝謝!

回答

2

我做這件事對你....你正在尋找希望它的內容:http://sqlfiddle.com/#!6/e7dc39/8

基本上,cross apply是從subquery或常規join不同。這是一個查詢,每查詢一次,查詢的外部就會返回。這就是爲什麼它能夠查看外部表格(子查詢不具備這種能力),這就是爲什麼它使用舊式連接語法(舊學校意思是條件的join條件在where條款中)。

只要對這個解決方案非常小心,因爲交叉應用並不一定是地球上最快的事情。但是,如果表格上的索引很好,那麼這個小小的查詢應該運行得非常快。

它是我能想到解決它的唯一方法,但它並不意味着它是唯一的方法!

只是一個超級快速編輯:如果您注意到,有些行不返回,因爲它們是FIRST策略,因此沒有tran_id比具有相同策略編號的tran_id更少。如果你想模擬一個outer join與申請,使用outer apply :)

+0

1)謝謝你的回答,你太棒了。和2)哦,我的,我從來不知道SQLfiddle。那太棒了! – 2014-12-12 23:44:35

+0

沒問題! sqlfiddle非常出色!有時候有點呆滯,但是有能力......我沒有抱怨。 – misterManager 2014-12-12 23:45:20

2

如果您使用SQL Server 2012或更高版本,您應該使用LAG()函數。看到下面的代碼片段,我覺得它比這裏給出的其他答案更清潔。

SELECT trans_id, policy_id, LAG(trans_id) OVER (PARTITION BY policy_id ORDER BY trans_id) 
FROM PolicyTransaction 
+0

不幸的是,我仍以此爲目標2008年。但他們補充說這是一個非常有趣的方法。我將不得不在我的本地盒子上玩弄它。謝謝! – 2014-12-12 23:55:09

+0

它更乾淨,雖然它只針對一個(或者我假設是2個)MSSQL版本,但不是一個非常知名的函數。窗口函數通常不會比交叉應用/外部應用好得多....但這是一個超級酷的功能 – misterManager 2014-12-13 00:33:06