1

SQL Server(2008)では、スキルIDが3、4、5、または4、5、6のすべての従業員を1つのテーブルで検索したいと思います。これらのセットのいずれかが必要です。たとえば、skillid = 4だけでは、一致するものはありません。このタイプのクエリを作成するにはどうすればよいですか?

表の例:

pkid, empid, skillid
 1     2       3
 2     2       4
 3     2       5
 4     5       6

上記の例では、empid=2はセット3,4,5に一致します。empid=5はそうではありません。

4

5 に答える 5

4

GROUP BYクエリで aおよび aHAVING句を使用する必要があります。

select empid
from t1
where skillid in (3, 4, 5) 
    or skillid in (4, 5, 6) 
group by empid
having count(distinct skillid) = 3

デモで SQL Fiddle を参照してください

于 2012-08-15T21:11:09.623 に答える
2

あなたの元の質問を読んだところ、次の基準のいずれかを満たす従業員を見つけたいということです。

  • 彼らのスキル ID は 3 と 4 と 5 です
  • 彼らのスキル ID は 4 AND 5 AND 6 です

(または両方)。この場合、相関サブクエリを使用して次のようなことをしたいと思うでしょう:

select *
from employee e
where (     exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid = 3 )
        and exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid = 4 )
        and exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid = 5 )
      )
   OR (     exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid = 4 )
        and exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid = 5 )
        and exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid = 6 )
      )

ただし、2 つのターゲット スキル セット { 3, 4, 5 } と { 4, 5, 6 } には共通のサブセット { 4 , 5 } があるため、単純化できます。リファクタリング、私たちは得る

select *
from employee e
where exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid =    4       )
  and exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid =    5       )
  and exists ( select * from employee_skill es3 on es3.empid = e.empid and es3.skillid in ( 3 , 6 ) )

別の手法は、次を使用することleft joinです。

select *
from employee e
left join employee_skill es3 on es3.empid = e.empid and es3.skillid = 3
left join employee_skill es4 on es4.empid = e.empid and es4.skillid = 4
left join employee_skill es5 on es5.empid = e.empid and es5.skillid = 5
left join employee_skill es6 on es6.empid = e.empid and es6.skillid = 6
where es4.empid is not null
  and es5.empid is not null
  and (    es3.empid is not null
        OR es6.empid is not null
      )

この後者のアプローチleft joinには、特定の従業員/スキルの組み合わせがデータ モデル内で一意であるという暗黙の前提が含まれています。そうでない場合、このアプローチではselect distinct、結果セットで重複した行が得られないように を使用する必要があります。

于 2012-08-15T22:05:41.713 に答える
1

試す

select pkid, empid
from your_table
where skillid in (3,4,5) or skillid in (4,5,6) 
group by pkid, empid
having count(distinct skillid) = 3
于 2012-08-15T21:07:36.103 に答える
1

以前の両方の回答は、(1,2,6)、(1,5,6)、または (2,5,6) などのセット メンバーシップを区別できないことに苦しんでいます。結果は、empid のみを表示する必要があります。 1,2,3 OR 4,5,6 の ALL のメンバー。

試す:

    create table Table1 (pkid int 制約 PK_Table1 主キー、empid int、skillid int)

    table1 の値に挿入 (1,2,1)
    table1 の値に挿入 (2,2,2)
    table1 の値に挿入 (3,2,3)
    table1 の値に挿入 (4,3,1)

    選択する
    から (
        empid を選択し、s1 として sum(t.s1)、s2 として sum(t.s2)、s3 として sum(t.s3)、s4 として sum(t.s4)、s5 として sum(t.s5)、sum( t.s6) として s6
        から
        (
            empid を選択、1 s1、0 s2、0 s3、0 s4、0 s5、0 s6
            テーブル1から
            スキル ID = 1
            ユニオンオール
            エンピッド、0、1、0、0、0、0 を選択
            テーブル1から
            スキル ID = 2
            ユニオンオール
            エンピッド、0、0、1、0、0、0 を選択
            テーブル1から
            スキル ID = 3
            ユニオンオール
            エンピッド、0、0、0、1、0、0 を選択
            テーブル1から
            スキル ID = 4
            ユニオンオール
            エンピッド、0、0、0、0、1、0 を選択
            テーブル1から
            スキル ID = 5
            ユニオンオール
            エンピッド、0、0、0、0、0、1 を選択
            テーブル1から
            スキル ID = 6
        ) t
        GROUP BY t.empid
    ) tt
    WHERE (tt.s1 = 1 および tt.s2 = 1 および tt.s3 = 1) または (tt.s4 = 1 および tt.s5=1 および tt.s6=1)
于 2012-08-15T21:23:07.677 に答える
0

empid IN (3,4,5) は empid = 3 または empid = 4 または empid = 5 の短縮形であるため、empid IN 3,4,5、または empid IN (4,5,6) は empid IN ( 3,4,5,6)。ただし、3、5、6、または 3、4、6 で人を数えないようにする必要があります。次のようなことができます。

SELECT empid, 345 AS skillset
FROM your_table
WHERE skillid IN (3,4,5)
GROUP BY empid
HAVING COUNT(DISTINCT skillid) = 3
UNION ALL
SELECT empid, 456 AS skillset
FROM your_table
WHERE skillid IN (4,5,6)
GROUP BY empid
HAVING COUNT(DISTINCT skillid) = 3

どのempidが両方のセットを持っているかなどを確認したい場合は、これをSELECTで囲むことができます。

于 2012-08-15T21:29:21.263 に答える