Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-如何返回包含所有子行的行_Sql_Join_Sql Server Ce - Fatal编程技术网

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

SQL-如何返回包含所有子行的行,sql,join,sql-server-ce,Sql,Join,Sql Server Ce,给定一个父级+参考表,其中参考表如下 Ref_ID PARENT_ID ------------------- 1 1 2 1 1 2 3 2 1 3 3 3 4 3 2 4 3

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

Ref_ID    PARENT_ID    
-------------------
1           1            
2           1            
1           2       
3           2       
1           3       
3           3       
4           3       
2           4       
3           4       
我试图返回
ref\u id
同时包含2和3的所有不同父行

询问

SELECT *
FROM  Parent 
WHERE parent_id in (SELECT parent_id from XRefTable where ref_id in (2, 3) )
返回所有父\u id 1、2、3、4

需要的正确结果是返回同时具有ref_id的2和3的parent_id 4,而其他的则具有2或3

谢谢你的帮助

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


抱歉,无法使用存储过程,因为它也必须在SQL Server CE上工作

您正在尝试进行集比较。为此,我强烈推荐
分组依据
具有
子句:

 SELECT parent_id 
 from XRefTable 
 where ref_id in ( 2, 3 ) 
 group by PARENT_ID 
 having count(distinct ref_id) = 2
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
子句统计匹配数,确保匹配数与列表大小相同。假设列表中没有空格,也没有空白值,这将起作用。

您可以这样做:

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

有趣的想法,但当查询变成(2,3,5,7,8,10,12,15,18,…)中的ref_id时,很快就会变得笨拙。有趣的想法,但当查询变成(2,3,5,7,8,10,12,15,18,…)中的ref_id时,很快就会变得笨拙。您的ref_id列表是如何存储的?该表的定义如上所述,ref_id的列表是根据用户输入生成的,点击UI列表中的一个项目会更新屏幕上的查询结果,此外,列表中的项目也是用户定义的,因此我们真的不知道查询/ref_id中可能有多少项目,因此注释您是否将列表存储在字符串中(可能是逗号分隔的)或在表中?否,(…..)中的ref_id是根据用户输入生成的,根本没有持久化看起来很好,是否考虑对其进行优化,完整的查询类似于从ParentTable中选择*,其中parent_id位于(…)目前,所有相关列都被索引到querySorry中的样本数据的成本为0.0048914,目前我没有进一步提高速度的想法。有多少不同的ref_id值?还有多少不同的parent_id值?您是否希望这些值随时间增长?@Tobsey这些是用户定义的-都是by的定义和选择