Sql IN功能

Dav*_*ten 4 sql relational-division

我有这样的东西作为一个SQL表:

EmplID   SkillID
1780 128
1780 133
2061 128
2068 128

假设我将字符串传递给存储过程,如'128,133'.我有一个split函数,所以sql可能如下所示:

SELECT DISTINCT EmplID
FROM EmplSkills
WHERE SkillID IN(SELECT data FROM dbo.Split(@Skills, ','))
Run Code Online (Sandbox Code Playgroud)

你可以很容易地看到,通过sql语句,我们将得到1780年,2061年和2068年.我真正想要的是获得那些EmplID,他们将128和133都作为技能ID,因此我应该只得到1780.

任何想法如何在没有一堆疯狂连接的情况下接近这个?

非常感谢.

jud*_*dda 6

SELECT EmplID
FROM EmplSkills
WHERE SkillID IN(SELECT data FROM dbo.Split(@Skills, ','))
GROUP BY EmplID
HAVING COUNT(DISTINCT SkillID) = (SELECT COUNT(*) FROM dbo.Split(@Skills, ','))
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是SQL Server,则可以使用CTE来简化生活.

; WITH Skills AS (
    SELECT DISTINCT data
    FROM dbo.Split(@Skills, ',')
)
SELECT EmplID
FROM EmplSkills
WHERE SkillID IN ( SELECT data FROM Skills )
GROUP BY EmplID
HAVING COUNT(DISTINCT SkillID) = (SELECT COUNT(*) FROM Skills)
Run Code Online (Sandbox Code Playgroud)