SQL Server:任何或IN

时间:2014-03-17 19:08:39

标签: sql sql-server sql-server-2008

我将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;匹配。

如果有语法错误,我也很抱歉,我不得不这样做。

非常感谢任何帮助!

1 个答案:

答案 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))

An SQLfiddle to test with

相关问题