Комплексное самостоятельное соединение SQL - PullRequest
1 голос
/ 24 октября 2011

У меня есть таблица (EmpInfo), где хранится информация о сотруднике.Вот поля:

EMPLID - varchar (11) (PK)
NAME - varchar (50)
POSITION_NBR - varchar (8)
CREPORTS5 - символ (8)
CREPORTS6 - символ (8)
CREPORTS7 - символ (8)

Поле CREPORTS ссылается на поле POSITION_NBR в цепочке команд.

Я пытаюсь написать SQL-запрос, где вместо этого я могу вернуть имя CREPORTSPOSITION_NBR

Иерархическая структура:

Джек Джонс - генеральный директор
Джон Смит - менеджер
Сара Тест - руководитель
Сьюзи Блерг - работник
МайкМартин - работник

-------------------------------------------------------------------------------- 
|  EMPLID  |     NAME      | POSITION_NBR  | CREPORTS5 | CREPORTS6 | CREPORTS7 | 
-------------------------------------------------------------------------------- 
|   1234   |  John Smith   |    11111      |   22222   |   NULL    |   NULL    |
-------------------------------------------------------------------------------- 
|   2345   |  Jack Jones   |    22222      |   NULL    |   NULL    |   NULL    |
--------------------------------------------------------------------------------  
|   3456   |  Sarah Test   |    33333      |   22222   |   11111   |   NULL    |
--------------------------------------------------------------------------------  
|   4567   |  Suzy Blerg   |    44444      |   22222   |   11111   |   33333   |
-------------------------------------------------------------------------------- 
|   5678   |  Mike Martin  |    55555      |   22222   |   11111   |   33333   |
--------------------------------------------------------------------------------

Я не очень разбираюсь в SQL, поэтому моя первая попытка была такой:

SELECT     EmpInfo.EMPLID    
               EmpInfo.CREPORTS5,
                  CAST
                    ((SELECT     TOP (1) NAME
                      FROM         EmpInfo AS subInfo
                      WHERE     (subInfo.POSITION_NBR = EmpInfo.CREPORTS5)) AS varchar(50)) AS CREPORTS5_NAME
FROM EmpInfo

Этот запрос работает, но медленнозапустить его с записями 300 тыс.

1 Ответ

3 голосов
/ 24 октября 2011

Не уверен, но я думаю, что это то, что вы хотите; просто сделайте само присоединение к таблице несколько раз:

DECLARE @t TABLE
    (
      EMPLID VARCHAR(11)
    , NAME VARCHAR(50)
    , POSITION_NBR VARCHAR(8)
    , CREPORTS5 CHAR(8)
    , CREPORTS6 CHAR(8)
    , CREPORTS7 CHAR(8)
    )


INSERT  INTO @t
        ( EMPLID, NAME, POSITION_NBR, CREPORTS5, CREPORTS6, CREPORTS7 )
VALUES  ( '1234', 'John Smith', '11111', '22222', NULL, NULL ),
        ( '2345', 'Jack Jones', '22222', NULL, NULL, NULL ),
        ( '3456', 'Sarah Test', '33333', '22222', '11111', NULL ) ,
        ( '4567', 'Suzy Blerg', '44444', '22222', '11111', '33333' ),
        ( '5678', 'Mike Martin', '55555', '22222', '11111', '33333' ) 


SELECT  t.EMPLID
      , t.Name
      , t2.NAME AS CDR5Name
      , t3.NAME AS CDR6Name
      , t4.NAME AS CDR7Name
FROM    @t t
        LEFT JOIN @t t2 ON t.CREPORTS5 = t2.POSITION_NBR
        LEFT JOIN @t t3 ON t.CREPORTS6 = t3.POSITION_NBR
        LEFT JOIN @t t4 ON t.CREPORTS7 = t4.POSITION_NBR

Кроме того, вы можете изменить типы данных для соответствия (используйте числовой тип для числовых данных и т. Д.). Также было бы неплохо, если бы вы могли опубликовать образец сценария вместо описания:)

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