给定一个父+参考表,其中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& 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
鉴于所需的正确结果是返回parent_id 4,其中包含两个< 2& 3,其他人有2或3
感谢任何帮助
仅供参考 - 查询中有4-7个表(取决于用户选择),因此性能是一个重要因素
SORRY不能使用存储过程,因为它也必须在SQL Server CE上工作
答案 0 :(得分:0)
SELECT parent_id
from XRefTable
where ref_id in ( 2, 3 )
group by PARENT_ID
having count(distinct ref_id) = 2
答案 1 :(得分:0)
您正在尝试进行逐步比较。为此,我强烈推荐group by
和having
条款:
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
子句计算匹配数,确保它与列表的大小相同。这将起作用,假设列表中没有空格且没有空值。
答案 2 :(得分: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