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 から SQL クエリに stateID を送信するとき、共通の PlanID を出力として見つける必要があります。UI から送信される stateID の数はわかりません (ユーザーのチェックボックス リストの選択に完全に依存するため)。

したがって、ユーザーが 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 つ以上の状態 ID を送信した場合はどうなりますか。そして 1 つの小さなメモは、私の状態 ID リストが文字列 (22,7,20 のように) として入ってくることです。

ありがとう

4

4 に答える 4

3

入ってくる状態の数が可変である場合は、join メソッドを使用しないでください。すぐに制御不能になります。私はもっ​​と次のようなものを提案します:

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自己結合を行うよりもはるかに安価なクエリになります。

于 2013-07-08T20:04:35.307 に答える
2

このクエリは、渡された ID と同じ数の異なる状態に一致するすべての計画を取得します。<IDS>クエリで 2 回使用される 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>) )

クエリに IDS のリストを挿入するだけで、次のようになります。

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 の数を特定できる場合は、副選択を削除できます。少し速いかもしれません。

于 2013-07-08T20:08:22.797 に答える
1

試す:

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

すべての PlanID に共通する必要がある場合は、 source

于 2013-07-08T20:05:44.960 に答える
0

動的クエリを使用すると、うまくいく可能性があります。

stateID リストをコンマ区切りパラメーターとしてプロシージャーに渡します。次に、動的クエリを次のように作成します

DECLARE @SQL VARCHAR(MAX);
SET @SQL = "SELECT PLANID FROM [table] WHERE STATEID = " + (SELECT REPLACE(@arg,","," AND STATEID = ");
于 2013-07-08T20:08:52.803 に答える