首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -如何返回包含所有子行的行

SQL -如何返回包含所有子行的行
EN

Stack Overflow用户
提问于 2012-10-23 23:24:43
回答 3查看 128关注 0票数 0

给定一个父表+引用表,其中Reference表如下

代码语言:javascript
复制
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的所有不同的父行

查询

代码语言:javascript
复制
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,但其他返回的ref_id为2或3

任何帮助我们都将不胜感激

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-23 23:28:56

代码语言:javascript
复制
 SELECT parent_id 
 from XRefTable 
 where ref_id in ( 2, 3 ) 
 group by PARENT_ID 
 having count(distinct ref_id) = 2
票数 0
EN

Stack Overflow用户

发布于 2012-10-23 23:30:18

您正在尝试进行集合式比较。为此,我强烈推荐使用group byhaving子句:

代码语言:javascript
复制
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子句的每个组件都对一个字段进行计数。逻辑要求两者都存在。

我更喜欢这种方法的原因是,您可以使用本质上相同的结构来更改逻辑。

如果列表是逗号分隔的字符串,则可以执行以下操作。也许不是“优雅的”和“关系的”,但它是有效的:

代码语言:javascript
复制
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子句计算匹配项的数量,确保它与列表的大小相同。假设列表中没有空格,也没有空值,这样做是可行的。

票数 0
EN

Stack Overflow用户

发布于 2012-10-23 23:30:44

你可以这样做:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13033902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档