我将XML片段传递给SQL Server 2008中的存储过程,该存储过程具有不同数量的类型' (0或更多) - 我正在寻找一个查询,我可以回复一位艺术家'具有所有提供的类型的行 - 如果找不到所有传递的类型,那么我不想返回任何内容。
我正在使用IN,但是如果找到任何传入的类型,这将返回,我要求所有这些都匹配。我也尝试过使用任何类型但是如果我没有提供类型(当应该有一些类型时)我仍然会得到一个匹配。
例如,在下面,我想要回复“艺术家”作品。与ArtistName'一些艺术家'它有流行音乐,电子音乐和前40种流派。如果有些艺术家'没有一个或多个类型,那么就不应该返回任何内容。
DECLARE @SomeXml XML
SET @SomeXml =
'<Genres>
<Genre name="pop"/>
<Genre name="electronic"/>
<Genre name="Top 40"/>
</Genres>'
SELECT ArtistName
FROM Artist a
INNER JOIN GenreArtistLink gal
ON gal.ArtistId = a.ArtistId
INNER JOIN Genre g
ON g.GenreId = gal.GenreId
WHERE a.ArtistName = 'Some Artist'
AND g.GenreName IN(SELECT M.c.value('./@name', 'varchar(255)') FROM @SomeXml.nodes('/Categories/Category') M(c))
我已经在上面使用了IN,但如上所述,只要其中一个传入的流派匹配,当我希望它只返回一个记录时,如果&#39; pop&#39;, &#39; electronic&#39;和&#39; top 40&#39;匹配。
如果有语法错误,我也很抱歉,我不得不这样做。
非常感谢任何帮助!
答案 0 :(得分:0)
您始终可以使用GROUP BY
/ COUNT
查看所有类别是否已完成;
SELECT ArtistName
FROM Artist a
INNER JOIN GenreArtistLink gal
ON gal.ArtistId = a.ArtistId
INNER JOIN Genre g
ON g.GenreId = gal.GenreId
AND g.GenreName IN(SELECT M.c.value('./@name', 'varchar(255)')
FROM @SomeXml.nodes('/Genres/Genre') M(c))
GROUP BY artistname
HAVING COUNT(*) = (SELECT COUNT(M.c.value('./@name', 'varchar(255)'))
FROM @SomeXml.nodes('/Genres/Genre') M(c))