0

给定一个父+参考表,其中Reference表如下

Ref_ID    PARENT_ID    
-------------------
1           1            
2           1            
1           2       
3           2       
1           3       
3           3       
4           3       
2           4       
3           4       

我正在尝试返回ref_id同时包含 2 和 3的所有不同父行

查询

SELECT *
FROM  Parent 
WHERE parent_id in (SELECT parent_id from XRefTable where ref_id in (2, 3) )

返回所有 parent_id 1、2、3、4

鉴于所需的正确结果是返回具有 ref_id 2 和 3 的 parent_id 4,其他具有 2 或 3

任何帮助表示赞赏

仅供参考 - 查询中有 4-7 个表(取决于用户选择),因此性能是一个重要因素

SORRY 不能使用存储过程,因为它也必须在 SQL Server CE 上工作

4

3 回答 3

0
 SELECT parent_id 
 from XRefTable 
 where ref_id in ( 2, 3 ) 
 group by PARENT_ID 
 having count(distinct ref_id) = 2
于 2012-10-23T15:28:56.453 回答
0

您正在尝试进行逐组比较。为此,我强烈推荐group byandhaving子句:

select parent_id
from Reference r
group by parent_id
having sum(case when ref_id = 2 then 1 else 0 end) > 0 and
       sum(case when ref_id = 3 then 1 else 0 end) > 0

该子句的每个组成部分都在having计算其中一个字段。逻辑要求两者都存在。

我比其他方法更喜欢这种方法的原因是你可以改变逻辑,使用基本相同的结构。

如果您有逗号分隔字符串中的列表,则以下内容将起作用。也许不是“优雅”和“关系”,但它有效:

set @Ref_ids = "1,2,3,4"

select parent_id
from Reference r
where charindex(','+cast(ref_id as varchar(255))+',', '+@ref_ids+',') > 0
group by parent_id
having count(distinct ref_id) = (len(replace(@ref_ids, ',', '')) - len(@ref_ids))+1

这是进行字符串操作以确定 ref_id 是否在列表中。然后该having子句计算匹配的数量,确保它与列表的大小相同。假设列表中没有空格并且没有空白值,这将起作用。

于 2012-10-23T15:30:17.903 回答
0

你可以这样做:

SELECT 
    ParentReference.Parent_ID
FROM
    ParentReference
    INNER JOIN ParentReference B ON ParentReference.Parent_ID = B.Parent_ID AND ParentReference.Ref_ID = 2 AND B.Ref_ID = 3
于 2012-10-23T15:30:43.990 回答