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

现在,当用户将 stateID 从 UI 发送到 sql 查询时,我需要找到常见的 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 个 stateID 怎么办。一个小提示是,我的 stateID 列表以字符串形式出现(如 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>是 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 的 common,

于 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 回答