2012-12-04 15 views
0

我的表icdClm是具有人員統計信息的表與另一個表(列出與該人相關的各種感興趣代碼)之間的聯結表。我希望能夠將這些表加入不同的次數。我對這個關係中涉及的其他表格不感興趣,因爲這裏簡單起見。我想要一個while loop來幫助生成查詢(如果有更好的方法,我打開一個不同的實現。)具有可變表連接數的動態SQL

如果查詢要運行兩次(兩個派生表)。

select distinct x1.patid 
from 
(
select ic.patid 
    from icdClm as ic 
    where ic.icd like '123%' 
) x1 inner join 
(
select ic.patid 
    from icdClm as ic 
    where ic.icd like '456%' 
)x2 on x1.patid=x2.patid 
inner join 
(
select ic.patid 
    from icdClm as ic 
    where ic.icd like '789%' 

) x3 on x1.patid=x3.patid 

注意,它們的派生表別名每次增加1。現在爲我的代碼。此代碼不會生成錯誤,但我已將其保留超過10分鐘,並且尚未返回任何結果。最後,我想創建另一個存儲過程,它依賴於這個存儲過程,它會詢問您需要的派生表的數量,然後用用戶輸入的參數填充where ic.icd like '123%',但首先要做的是:哪些不適用於下面的查詢?

declare 
@x int 
,@y int 
,@sql nvarchar(1000) 

select 
@x=1 
,@y=3 
,@sql = 
'select distinct x1.patid 
from 
(
select ic.patid 
    from icdClm as ic 
    where ic.icd like ''123%'' 
) x1' 
while @x < @y 
begin; 
set @[email protected]+ 
'inner join 
(
    select ic.pati 
    from icdClm as ic 
    where ic.icd like ''456%'' 
) x1 on x'+CAST(@y as CHAR(10))+'.patid=x1.patid' 
set @[email protected]+1 
end; 
print @sql 

回答

2
while @x < @y 
begin; 

set @[email protected]+1 
end; 

@y是什麼遞增所以這個循環將不僅不會執行(因爲y小於x)或將是一個無限循環*因爲@y總是會大於@x

也許你的意思是@[email protected]+1

*您可能會在整數溢出得到一個最終

+0

你是對的,它是@x應該增加,因爲杜!否則它會是一個無限循環。現在查詢實際運行,我可以看到一些其他的錯誤,但這是我的問題的關鍵。 gracias,高級frix。 – wootscootinboogie

+0

:)作爲一邊我會在連接條款,而不是內聯視圖中與AND&icdClm x1 INNER JOIN icdClm x2上x1.patid = x2.patid和x1.icd像''123%''...'但我不確定這會讓事情變得更好 –

+0

這就是我首先想到的,但是當我將它散列出來時,這種方式似乎更容易。我會做一些測試,以及哪一個更快,我會滾。 – wootscootinboogie

2

它看起來像你綁定做一個條件和多個條款。
如果使用相交,則不需要唯一的名稱。
我這樣做,但我建立它在C#。
抱歉缺少SP示例。

select patid 
    from icdClm 
    where icd like '123%' 
Intersect 
select patid 
    from icdClm 
    where icd like '456%' 

EXCEPT and INTERSECT (Transact-SQL)

我發現交集是有效的。
超過5個連接我遇到了一個問題,查詢優化器獲得了我稱之爲防禦性的響應時間,併產生了我的數據。
Intersect以蠻力的方式每次做一件,這可能會或可能不會有利於您的數據。
既然你喜歡在開始時沒有通配符,它​​可能會使用索引。

+0

hmm ..這很有趣,我幾乎從來沒有使用過交叉,我不知道你不必保留不同的別名。 – wootscootinboogie

+0

爭取讓別名正確(我還在修補的東西)就是爲什麼我選擇使用我想最終查詢的簡化版本。我會看看這是如何與我的數據執行的,但無論如何,這是一個很好的小口袋藏在我的後面的口袋裏。 – wootscootinboogie