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.
任何想法如何在没有一堆疯狂连接的情况下接近这个?
非常感谢.
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)