SQL select语句动态多重条件

SQL select语句动态多重条件,sql,sql-server,select,Sql,Sql Server,Select,我有3个表,比如imagesid、newsid、typesid、category、obj_id、type 例如,新闻A的类别是黑色、红色 数据结构就像 { types(xxxx1,red,news_A,news) types(xxxx2,black,news_A,news) } 现在我需要找出所有红色和黑色的图像 在这种情况下,我需要图像 { types(oooo1,red,images_B,images) types(oooo2,black,images_B,images)

我有3个表,比如imagesid、newsid、typesid、category、obj_id、type

例如,新闻A的类别是黑色、红色

数据结构就像

{
  types(xxxx1,red,news_A,news)
  types(xxxx2,black,news_A,news)
}
现在我需要找出所有红色和黑色的图像

在这种情况下,我需要图像

{
  types(oooo1,red,images_B,images)
  types(oooo2,black,images_B,images)
  types(oooo3,red,images_C,images)
  types(oooo4,red,images_D,images)
  types(oooo5,black,images_E,images)
}
显然,我不会写

select obj_id from types 
where category in (select category from types where obj_id = news_A) 
and type = images.
因为,像那样,它将返回图像B,C,D,E。我只需要图像B

范畴也是动态的。它可以是红色、蓝色、粉色……

一种方法

SELECT * INTO #types
FROM 
(SELECT 'xxxx1' AS id,'red'  AS category,'news_A' AS obj_id,'news' AS [type] UNION ALL
SELECT 'xxxx2' AS id,'black'  AS category,'news_A' AS obj_id,'news' AS [type] UNION ALL
SELECT 'oooo1' AS id,'red'  AS category,'images_B' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo2' AS id,'black'  AS category,'images_B' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo3' AS id,'red'  AS category,'images_C' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo4' AS id,'red'  AS category,'images_D' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo5' AS id,'black'  AS category,'images_E' AS obj_id,'images' AS [type]) X

declare @target varchar(10)
set @target = 'news_A'

;with  ConcatTypes As
(
SELECT obj_id,
  (
        select distinct '' + t.[category] as cat
        from #types t
        where t.obj_id = t1.obj_id
        order by cat
        for xml path('')
    ) as catlist
FROM #types t1
GROUP BY obj_id
)
SELECT obj_id, catlist 
FROM ConcatTypes
WHERE obj_id<> @target and catlist = 
          (select catlist FROM ConcatTypes where obj_id=@target)
一种方法

SELECT * INTO #types
FROM 
(SELECT 'xxxx1' AS id,'red'  AS category,'news_A' AS obj_id,'news' AS [type] UNION ALL
SELECT 'xxxx2' AS id,'black'  AS category,'news_A' AS obj_id,'news' AS [type] UNION ALL
SELECT 'oooo1' AS id,'red'  AS category,'images_B' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo2' AS id,'black'  AS category,'images_B' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo3' AS id,'red'  AS category,'images_C' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo4' AS id,'red'  AS category,'images_D' AS obj_id,'images' AS [type] UNION ALL
SELECT 'oooo5' AS id,'black'  AS category,'images_E' AS obj_id,'images' AS [type]) X

declare @target varchar(10)
set @target = 'news_A'

;with  ConcatTypes As
(
SELECT obj_id,
  (
        select distinct '' + t.[category] as cat
        from #types t
        where t.obj_id = t1.obj_id
        order by cat
        for xml path('')
    ) as catlist
FROM #types t1
GROUP BY obj_id
)
SELECT obj_id, catlist 
FROM ConcatTypes
WHERE obj_id<> @target and catlist = 
          (select catlist FROM ConcatTypes where obj_id=@target)

Thx马丁。但是我不能像你描述的那样硬编码[类型]。“实类型”表是一个由行组成的表,您不必这样做。那部分只是为了演示。跳过这一点,从开始;将ConcatTypes设置为,并从那里的类型表中选择。我现在把它改为临时表。谢谢马丁。但是我不能像你描述的那样硬编码[类型]。“实类型”表是一个由行组成的表,您不必这样做。那部分只是为了演示。跳过这一点,从开始;将ConcatTypes设置为,并从那里的类型表中选择。我现在改为引用临时表。