2015-01-20 2 views
0

У меня есть таблица в T-SQL, который выглядит как этогоКак получить имена в пределах столбца, если значения в другом столбце соответствует первичному ключу нужного имени

personid | firstname | lastname | managerid 
1  | Tom  | Bricks | null 
2  | Joe  | Liam  | 1 
3  | Mary  | Hattan | 2 

Я пытаюсь запрос из таблицы как это:

Name | ManagerName 
Tom | No manager 
Joe | Tom 
Mary | Joe 

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

SELECT 'firstname' + ' ' + 'lastname' AS 'Name 

У кого-нибудь есть идея?

+1

Вы действительно работает со всеми MySQL, SQL Server и d postgresql? – jarlh

+1

Возможный дубликат [Self Join, чтобы получить имя менеджера сотрудника] (http://stackoverflow.com/questions/11427300/self-join-to-get-employee-manager-name) –

+0

Использовать self join в SQL – HaveNoDisplayName

ответ

0

Вы можете использовать Self Join для получения данных с использованием двух столбцов в одной таблице.

Попробуйте

SELECT t1.firstname as Name, ISNULL(t2.firstname,'No manager') as ManagerName 
    FROM tblName t1 
     LEFT JOIN tblName t2 
     ON t1.managerid = t2.personid 

DEMO

+0

Привет, спасибо за помощь - проблема в том, что идентификатор менеджера соответствует персонажу в таблице 1. Нет второй таблицы, я смущен этим. – Sizejaul

+0

Да, правильно, второй таблицы нет, поэтому, если вы видите запрос, я присоединяюсь к одной таблице дважды «tblName», используя только два экземпляра t1 и t2. Это называется self join – HaveNoDisplayName

+0

Вы также можете проверить ссылку DEMO, которая показывает, как работает этот запрос – HaveNoDisplayName

0

Вы можете сделать это с помощью рекурсивных CTE:

DECLARE @t TABLE 
    (
     personid INT , 
     firstname NVARCHAR(MAX) , 
     lastname NVARCHAR(MAX) , 
     managerid INT 
    ) 

INSERT INTO @t 
VALUES (1, 'Tom', 'Bricks', NULL), 
     (2, 'Joe', 'Liam', 1), 
     (3, 'Mary', 'Hattan', 2); 
WITH cte 
      AS (SELECT personid , 
         firstname , 
         lastname , 
         managerid 
       FROM  @t 
       WHERE ManagerID IS NULL 
       UNION ALL 
       SELECT t.personid , 
         t.firstname , 
         t.lastname , 
         t.managerid 
       FROM  @t t 
         INNER JOIN cte ecte ON ecte.personid = t.ManagerID 
      ) 
    SELECT * 
    FROM cte 
GO 

Выход:

personid firstname lastname managerid 
1 Tom Bricks NULL 
2 Joe Liam 1 
3 Mary Hattan 2 
Смежные вопросы