Sql server 有没有一种方法可以将select子句与where子句一起应用,where子句的条件由另一个select子句驱动?
这是样本数据 现在我想要,如果我得到一个输入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中查找 直到获取底端节点为止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
我认为这足够了???有几种方法可以做到这一点,但这是最简单的。我将插入一个临时表变量@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