2013-07-08 84 views
0

我有一個類似的情況下同多次:內連接基於輸入

PlanID StateID 

    1 22 
    2 22 
    2 30 
    3 7 
    3 22 
    3 33 
    3 46 
    4 22 
    5 22 
    12 22 
    13 7 
    13 22 
    13 30 
    13 33 
    13 40 
    13 46 
    14 22 
    15 7 
    15 20 
    15 22 
    15 30 
    15 33 
    15 40 
    15 46 
    16 22 
    17 7 
    17 20 
    17 22 
    17 30 
    17 40 

現在,當用戶從UI發送STATEID到SQL查詢我需要找到共同PlanIDs作爲出put.I不知道如何許多stateID將從UI發送(因爲它完全取決於用戶的複選框列表選擇)

所以如果用戶發送22和7,則o/p應該是3,13,15,17 如果用戶發送22, 20,7然後o/p應該是15,17

查詢我到目前爲止是:

select a.*, b.* from 

Plan_State a 
Inner join Plan_State b 
ON a.PlanID = b.PlanID 

WHERE 
    (
     a.StateID =22 
    ) AND 
    (
     b.StateID=7 
    ) 

但是,如果用戶發送超過2個stateID,該怎麼辦。和一個小值得注意的是,在未來作爲一個字符串(像22,7,20)

感謝

+0

因此,如果他們發送3個狀態ID,你需要加入3種方式'a = 22和b = 7和c = 20'? 4個州將是'a =?/ b =?/ c =?/ d =?'? –

+0

是的,但如何編寫基於輸入的動態查詢? – user1882705

+0

你的UI和查詢之間有什麼關係?是不是有一些編程語言可以爲你構建動態查詢? – GolezTrol

回答

2

此查詢獲取,因爲有傳入的ID匹配儘可能多的不同的狀態,所有的計劃。 <IDS>是在查詢中使用兩次的id的列表。

SELECT DISTINCT 
    PlanID 
FROM 
    YourTable t 
WHERE 
    t.StateID in (<IDS>) 
GROUP BY 
    PlanID 
HAVING 
    COUNT('x') = 
    (SELECT 
     COUNT(DISTINCT StateId) 
     FROM 
     YourTable st 
     WHERE 
     st.StateID IN (<IDS>)) 

所有你需要做的是插入查詢ID列表,所以它看起來是這樣的:

SELECT DISTINCT 
    PlanID 
FROM 
    YourTable t 
WHERE 
    t.StateID in (1, 2, 5) 
GROUP BY 
    PlanID 
HAVING 
    COUNT('x') = 
    (SELECT 
     COUNT(DISTINCT StateId) 
     FROM 
     YourTable st 
     WHERE 
     st.StateID IN (1, 2, 5)) 

沒有報價,沒有分裂(除非你想要做一些輸入驗證/衛生)。

如果您能夠解析輸入並確定其中的不同ID的數量,則可以刪除子選擇。它可能會更快一點。

3

如果你有進來的狀態的變量數,則不要使用加入我STATEID名單方法。它會很快失去控制。我建議更多的東西一樣:

SELECT PlanID, COUNT(stateID) AS count 
FROM yourtable 
WHERE (stateID IN (x,x,x,x,x)) 
GROUP BY PlanID 
HAVING count = ($number_of_states_being_searched_for) 

你仍然不得不計數你有多少國尋找,但仍然會比做N便宜得多的查詢自聯接。

1

嘗試:

SELECT PlanID 
FROM this_table 
GROUP BY PlanID 
HAVING COUNT(DISTINCT StateID) = (SELECT COUNT(DISTINCT StateID) FROM this_table) 

如果你需要的所有PlanIDs常見, source

0

一個動態查詢可以爲你做的伎倆。

將stateID列表作爲逗號分隔參數傳遞給過程。那麼建立動態查詢爲

DECLARE @SQL VARCHAR(MAX); 
SET @SQL = "SELECT PLANID FROM [table] WHERE STATEID = " + (SELECT REPLACE(@arg,","," AND STATEID = "); 
+0

「STATEID」在單行中可以有多少個值?我認爲你仍然需要一些聚合。 – HABO