Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 t-sql中的多连接_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server t-sql中的多连接

Sql server t-sql中的多连接,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我在查询时遇到了一些问题。我有两张桌子: declare @t1 table(pat_ref varchar(10),pas_id varchar(10), is_mnor char(1)) declare @t2 table (prev_pat_ref varchar(10), pat_ref varchar(10)) insert into @t1 values ('1','111','y') ,('5','115','y') ,('6','116','y')

我在查询时遇到了一些问题。我有两张桌子:

declare @t1 table(pat_ref varchar(10),pas_id varchar(10), is_mnor char(1))
declare @t2 table (prev_pat_ref varchar(10),  pat_ref varchar(10))

insert into @t1 
values ('1','111','y')
      ,('5','115','y')
      ,('6','116','y')
      ,('2','112','n')
      ,('3','113','y')
      ,('4','114','n')

insert into @t2 
values ('1','2')
      ,('5','1')
      ,('6','5')
      ,('3','4')
现在我想:

pat_ref pas_id  is_mnor major_ref
1       111     y       112
5       115     y       112
2       112     n       NULL
3       113     y       114
4       114     n       NULL
但是,我的问题是:

 select t1.* 
 , case when t1.is_mnor='y' then t3.pas_id else null  end as major_ref
 from @t1 t1
 left join @t2 t2 on t1.pat_ref=t2.prev_pat_ref
 left join @t1 t3 on t3.pat_ref=t2.pat_ref 
我得到:

pat_ref pas_id  is_mnor major_ref
1       111     y       112
5       115     y       111 ---this should be 112
2       112     n       NULL
3       113     y       114
4       114     n       NULL

注意:@t1和@t2的初始连接列是
t1.pat_ref=t2.prev_pat_ref

我认为您希望从t2中获得最底层的关系,并链接t1中的那些行。如果这是真的,那么您将需要递归cte来获得最底层的行,然后是2个连接:

;with cte as(select *, prev_pat_ref as p, 1 as l from @t2
            union all
            select t.*, c.p, c.l + 1 
            from cte c join @t2 t on t.prev_pat_ref = c.pat_ref),
bot as(select *, row_number() over(partition by p order by l desc) rn from cte)

select t1.*, case when t1.is_mnor='y' then t2.pas_id else null end as major_ref 
from @t1 t1
left join bot b on t1.pat_ref = b.p and b.rn = 1
left join @t1 t2 on b.pat_ref = t2.pat_ref

小提琴

看起来你实际上有3张桌子。t3看起来像什么?HI@kaz感谢您的回复,实际上t3是t1作为别名表从t1获取pas_id。感谢您的示例,您进入了两个层次,5连接到1,1连接到2,链在这里终止。如果t2与(2,4)有一行,那么预期结果会变为114吗?换言之,您希望保持链接直到结束还是仅限于某个深度?t1中的Pat参考文献5,先前基于t2的Pat参考文献为1,基于t1的Pat id 1的pas_id为111。你的结果和预期的一样。您需要更好地解释您的问题以获得有用的答案。在
@t2
表中将
('5','1')
更改为
('5','2')
)。您可能可以简化查询,使其在外部级别没有联接。@ypercube,我必须导航到通过bot和t2传递_id,在没有联接的情况下如何进行此操作?您好@Giorgi Nakeuri,很抱歉回复太晚。成功了,这就是我想要的。谢谢你的回答。嗨@Giorgi Nakeuri,我想我在这个查询中得到了错误的数据,实际上我在两个表中都包含了额外的行,我得到了错误的结果。查询必须在t1.is_minor='Y'时返回,然后必须从is_minor='N'的t1返回pas_id。我希望你明白我的意思。你能帮我做这个吗。Thanks@user3583912,我发现了问题。编辑答案。问题是
选择t.*,c.prev\u pat\u ref,c.l+1
。更改为
选择t.*、c.p、c.l+1