Есть ли способ применить предложение select с предложением where, имеющим условие из другого предложения select? - PullRequest
1 голос
/ 20 июня 2019
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

Это пример данных ...

Теперь я хочу, чтобы, если я получу идентификатор ввода, например, я получу ID = 6

Теперь я хочу выбрать только подключенных родителей и детей в случае ID = 6

6 0006 0002 TELLER BRINGER

Так как у меня Manager ID 0002, он должен получить результат для 0002 в Agent ID, что составляет ID = 2

2 0002 0001 REGIONAL MANAGER ALBERT

Теперь у меня есть Manager ID 0001, поэтому он должен получить результат для Agent ID 0001 что ID = 1

1 0001 0 GEN MANAGER STEVE

Теперь у нас есть Manager ID как 0, поэтому перестанем двигаться в верхнем направлении и теперь снова вернемся к ID = 6, где мы начали.

6 0006 0002 TELLER BRINGER

Теперь мы проверим Agent ID этой строки в других Manager ID ... и затем выберите результаты и сделайте то же самое (выберите Agent ID и найдите в Manager id) другой строки

Пока не будет извлечен нижний конечный узел.

Думаю, хватит ??

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Есть несколько способов сделать это, но это самый простой.Я вставляю в переменную временную таблицу @result, потому что вы хотите идти вверх и вниз от цели.

Сначала настройте свои данные:

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
0 голосов
/ 20 июня 2019

Вы можете попробовать рекурсивную хранимую процедуру (для простоты я использую две таблицы):

Приготовление:

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');

Процедура:

CREATE PROCEDURE HIERARCHY @AGENT_CODE AS VARCHAR(10), @MAX_LEVEL AS INTEGER, @CUR_LEVEL AS INTEGER

AS 

BEGIN

DECLARE @VAR_AGENT VARCHAR(10);    
DECLARE @VAR_MANAGER VARCHAR(10);    



SELECT @VAR_AGENT = AGENT_CODE 
     , @VAR_MANAGER = MANAGER_CODE
FROM TEMP
WHERE AGENT_CODE = @AGENT_CODE

IF @VAR_AGENT IS NOT NULL AND @CUR_LEVEL < @MAX_LEVEL
   BEGIN
       INSERT INTO TEMP_RETURN 
       SELECT * FROM TEMP
       WHERE AGENT_CODE = @AGENT_CODE;
       SET @CUR_LEVEL = @CUR_LEVEL + 1;
       EXEC HIERARCHY @VAR_MANAGER, @MAX_LEVEL, @CUR_LEVEL;
   END

END

Максимальный уровень и уровень cur используются, чтобы избежать бесконечных циклов в случае циклов на столе

Позвонить и показать данные:

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

Надеюсь, это поможет: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...