2009-10-07 28 views
0

好的,基本上需要的是在使用大量連接時使用行數並使用這些rownumbers的where子句的方法。使用大量的鏈接/連接每次迭代1行

如必須對一個表這個查詢雖然產生像

select ADDRESS.ADDRESS FROM ADDRESS 
INNER JOIN WORKHISTORY ON WORKHISTORY.ADDRESSRID=ADDRESS.ADDRESSRID 
INNER JOIN PERSON ON PERSON.PERSONRID=WORKHISTORY.PERSONRID 
WHERE PERSONRID=<some number> AND WORKHISTORY.ROWNUMBER=1 

ROWNUMBER。所以,如果我們要訪問的第二WORKHISTORY記錄的地址,我們可以只去WORKHISTORY.ROWNUMBER=2,如果說我們有兩個地址的,我們可以通過一個WORKHISTORY記錄的地址循環使用ADDRESS.ROWNUMBER=1ADDRESS.ROWNUMBER=2

這應該能夠匹配是一個自動生成的查詢。因此,可能會有超過10個內部連接以便到達相關表格,並且我們需要能夠獨立於其餘表格循環訪問每個表格的記錄。

我知道那裏有RANK和ROWNUMBER函數,但是我沒有看到它是如何工作的,因爲所有內部連接都是

注意:在這個示例查詢中,應該自動生成ROWNUMBER!它不應該存儲在實際的表中

+0

重複的 http://stackoverflow.com/questions/534240/mssql-select-statement-with-incremental-integer-column-not從表 – Rodrigo 2009-10-07 18:50:03

+0

讓它成爲它的延伸。在多個連接的表上使用相同的rownumber技術。 (我不擔心2005年以前的兼容性) – Earlz 2009-10-07 19:01:18

回答

1

您可以使用臨時表嗎?

我問,因爲你可以寫這樣的代碼:

select a.field1, b.field2, c.field3, identity (int, 1,1) as TableRownumber into #temp 
from table1 a 
join table2 b on a.table1id = b.table1id 
join table3 c on b.table2id = c.table2id 

select * from #temp where ... 
+0

可能是併發問題,但使用自動臨時表名稱生成,它不應該是一個問題..這可能對我很有用 – Earlz 2009-10-07 18:43:39

+0

它是否幾乎沒有效率創建多個臨時表,因爲我需要能夠在每個連接上使用這個rownumber效果,所以對於一個查詢使用多達10個臨時表是一個問題? (我沒有試圖預先優化..它只是聽起來有點瘋狂,沒有效率) – Earlz 2009-10-07 18:58:25

+0

如果每個用戶和很多併發用戶中都有大量數據,那麼您可能會遇到問題,但實際上您必須解決問題首先。不管你如何解決這個問題,也許你會有一些效率問題。您可以爲涉及它們的後續查詢索引臨時表。我想你可以在最後創建一個臨時表,其中包括來自其他臨時表的ID以及所需的其他信息,然後放棄前十個。你可以使用所涉及的表中的實際ID字段,還是在總體臨時表中使用行號與ID進行比較? – HLGEM 2009-10-07 19:37:58