Sql server 有没有一种方法可以将select子句与where子句一起应用,where子句的条件由另一个select子句驱动?

Sql server 有没有一种方法可以将select子句与where子句一起应用,where子句的条件由另一个select子句驱动?,sql-server,Sql Server,这是样本数据 现在我想要,如果我得到一个输入id,例如,我得到id=6 现在我只想在ID=6的情况下选择连接的父级和子级 6 0006 0002出纳员投递员 因为我有管理器ID 0002,所以它应该在代理ID中获取0002的结果,即ID=2 2 0002 0001区域经理ALBERT 现在我有了管理器ID 0001,所以它应该获取代理ID 0001的结果 也就是ID=1 10010总经理史蒂夫 现在我们将管理器ID设置为0,因此停止向上移动,现在再次返回ID=6,从这里开始 6 0006 000

这是样本数据

现在我想要,如果我得到一个输入id,例如,我得到id=6

现在我只想在ID=6的情况下选择连接的父级和子级

6 0006 0002出纳员投递员

因为我有管理器ID 0002,所以它应该在代理ID中获取0002的结果,即ID=2

2 0002 0001区域经理ALBERT

现在我有了管理器ID 0001,所以它应该获取代理ID 0001的结果 也就是ID=1

10010总经理史蒂夫

现在我们将管理器ID设置为0,因此停止向上移动,现在再次返回ID=6,从这里开始

6 0006 0002出纳员投递员

现在,我们将在“其他管理员ID”中检查此行的代理ID。。。然后选择结果并执行相同的操作,选择代理ID并在另一行的管理器ID中查找

直到获取底端节点为止


我认为这足够了???

有几种方法可以做到这一点,但这是最简单的。我将插入一个临时表变量@result,因为您希望从目标上下移动

首先设置您的数据:

ID     AGENT_CODE     MANAGER_CODE    DESIGNATION            NAME
1      0001           0               GEN MANAGER            STEVE
2      0002           0001            REGIONAL MANAGER       ALBERT
3      0003           0001            REGIONAL MANAGER       JOHN
4      0004           0002            UNIVERSAL TELLER       HENRY
5      0005           0003            UNIVERSAL TELLER       MEVRICK
6      0006           0002            TELLER                 BRINGER
7      0007           0003            TELLER                 ANTONIO
创建一个表来保存结果和我们要查找的目标

declare @t table(ID int, AGENT_CODE varchar(10), MANAGER_CODE varchar(10), DESIGNATION varchar(20), NAME varchar(20))
insert @t values 
 (1, '0001', '0000', 'GEN MANAGER', 'STEVE') 
,(2, '0002', '0001', 'REGIONAL MANAGER', 'ALBERT') 
,(3, '0003', '0001', 'REGIONAL MANAGER', 'JOHN') 
,(4, '0004', '0002', 'UNIVERSAL TELLER', 'HENRY') 
,(5, '0005', '0003', 'UNIVERSAL TELLER', 'MEVRICK') 
,(6, '0006', '0002', 'TELLER', 'BRINGER') 
,(7, '0007', '0003', 'TELLER', 'ANTONIO')

select * from @t
横穿这棵树

declare @result table(ID int, AGENT_CODE varchar(10), MANAGER_CODE varchar(10), DESIGNATION varchar(20), NAME varchar(20))

declare @target int; set @target=6
沿相反方向向下遍历树

;with cte as 
(
    select * from @t where id=@target
    union all
    select t.* from @t t
    join cte on cte.manager_code=t.agent_code
) 
insert @result
select * from cte
输出您的结果:

;with cte as 
(
    select * from @t where id=@target
    union all
    select t.* from @t t
    join cte on cte.agent_code=t.manager_code
) 
insert @result
select * from cte

您可以尝试使用递归存储过程。为了简单起见,我使用了两个表:

准备:

select distinct * from @result

ID  AGENT_CODE  MANAGER_CODE    DESIGNATION       NAME
1   0001        0000            GEN MANAGER       STEVE
2   0002        0001            REGIONAL MANAGER  ALBERT
6   0006        0002            TELLER            BRINGER
程序:

CREATE TABLE TEMP
( ID INT
, AGENT_CODE VARCHAR(10)
, MANAGER_CODE VARCHAR(10)
, DESIGNATION VARCHAR(20)
, NAME VARCHAR(20));



CREATE TABLE TEMP_RETURN
( ID INT
, AGENT_CODE VARCHAR(10)
, MANAGER_CODE VARCHAR(10)
, DESIGNATION VARCHAR(20)
, NAME VARCHAR(20));



INSERT INTO TEMP VALUES  
 (1, '0001', '0000', 'GEN MANAGER', 'STEVE') 
,(2, '0002', '0001', 'REGIONAL MANAGER', 'ALBERT') 
,(3, '0003', '0001', 'REGIONAL MANAGER', 'JOHN') 
,(4, '0004', '0002', 'UNIVERSAL TELLER', 'HENRY') 
,(5, '0005', '0003', 'UNIVERSAL TELLER', 'MEVRICK') 
,(6, '0006', '0002', 'TELLER', 'BRINGER') 
,(7, '0007', '0003', 'TELLER', 'ANTONIO');
输出:

DELETE
FROM TEMP_RETURN;


EXEC HIERARCHY @AGENT_CODE='0006', @CUR_LEVEL = 0, @MAX_LEVEL = 100;

SELECT *
FROM TEMP_RETURN
ORDER BY AGENT_CODE;

希望有帮助:-

提供示例数据和所需结果。只需编辑您的问题,而不是在您自己的问题中添加注释。请发布一些示例数据和您想要的结果。这将使帮助他人变得容易cte@TomC我已经提供了数据和期望的结果谢谢你,在最后添加select distinct*from result order by ID所需的JU非常有效
DELETE
FROM TEMP_RETURN;


EXEC HIERARCHY @AGENT_CODE='0006', @CUR_LEVEL = 0, @MAX_LEVEL = 100;

SELECT *
FROM TEMP_RETURN
ORDER BY AGENT_CODE;
1   0001    0000    GEN MANAGER STEVE
2   0002    0001    REGIONAL MANAGER    ALBERT
6   0006    0002    TELLER  BRINGER