Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 server 2005 获取所有父级的公共子级的最佳SQL查询_Sql Server 2005 - Fatal编程技术网

Sql server 2005 获取所有父级的公共子级的最佳SQL查询

Sql server 2005 获取所有父级的公共子级的最佳SQL查询,sql-server-2005,Sql Server 2005,我有两张桌子,父母桌A和孩子桌B 在下面给出的脚本中 我只需要为这个示例“C3”获取一条记录,它是P1、P2和P3的常见子级 我只能在下面想到这个方法 Create table #tableA ( PkCol varchar(3) ) Create table #tableB ( FkCol varchar(3), FKChild varchar(10) ) Insert Into #tableA Select 'P1' union Select 'P2' union Select 'P3'

我有两张桌子,父母桌A和孩子桌B

在下面给出的脚本中 我只需要为这个示例“C3”获取一条记录,它是P1、P2和P3的常见子级

我只能在下面想到这个方法

Create table #tableA ( PkCol varchar(3) )
Create table #tableB ( FkCol varchar(3), FKChild varchar(10) )

Insert Into #tableA
Select 'P1' union
Select 'P2' union
Select 'P3' 

Insert Into #tableB
Select 'P1', 'C1' union
Select 'P1', 'C2' union
Select 'P1', 'C3' union
Select 'P2', 'C3' union
Select 'P2', 'C4' union
Select 'P2', 'C5' union
Select 'P3', 'C3' union
Select 'P3', 'C6' union
Select 'P3', 'C7' 

Select tb.FKChild from #tableA ta Inner Join #tableB tb on tb.FkCol = ta.PkCol
Group By tb.FKChild
Having Count(Distinct ta.PkCol) = (Select Count(*) from #tableA)

Drop table #tableA
Drop table #tableB

当实际的父表有近1K条记录,而子表有近200多万条记录时,有没有更好的方法来做到这一点,既干净又不会影响性能?

首先检查您的查询计划。 如果您非常确定表的比例如您所描述的1k:2M,并且您的查询计划会显示其他内容,那么您可以向联接添加一个提示,如下所述:

如果这两个表都适合memmory,请尝试使用哈希联接,如果不适合,请根据查询进行循环联接:

Select tb.FKChild from #tableA ta Inner Loop Join #tableB tb on tb.FkCol = ta.PkCol
Group By tb.FKChild
Having Count(Distinct ta.PkCol) = (Select Count(*) from #tableA)
但是请注意,如果不确定数据比率,请将查询计划留给sql server选择,因为如果强制使用不正确的联接类型,可能会影响性能