2016-02-25 7 views
1

У меня есть вопрос о SQL ServerНужна помощь запрос в SQL Server 2008 на основе условий

Таблица: Emp

empid | empidref | Name 
------+----------+------ 
1 | NULL | a 
3 | 1  | b 
4 | 2  | c 
2 | NULL  | d 
5 | NULL  | e 
6 | NULL  | f 
8 | 7  | g 
7 | NULL  | h 
10 |NULL  |aa 

Я хочу объединить empidref значения в empid когда empid также и то же значение. Если empid значение доступно в empidref таблице то же empidref значения считает EmpID и соответствующее empidref имени нужно получить, если empid значения не доступно в empidref таблице то же EmpId значение считает EmpID и соответствующее имя нужно получить

На основании выше таблицы I хотите выход, как показано ниже

Empid | Name 
-------+------ 
1  | b 
2  | c 
5  | e 
6  | f 
7  |g 
10  |aa 

Пожалуйста, скажите мне, как написать запрос для выполнения этой задачи в SQL Server

ответ

0
SELECT e1.empid, COALESCE(e2.Name, e1.Name) 
FROM Emp e1 LEFT JOIN Emp e2 
    ON e1.empid = e2.empidref 
WHERE e1.empidref IS NULL 
+0

HI Учитывая вышеизложенное запроса несколько записей от отсутствуют (не дали ожидаемого результата) EmpId: 5,6,10 записывает не получает в неработающей put.we требуется, чтобы записи also.please скажите мне, как достичь этой задачи на сервере sql. – vasulr

0

Надеюсь, это сработает для вашего требования.

SELECT 
E1.EmpId 
,CASE WHEN E2.Name IS NOT NULL 
     THEN E2.Name 
     ELSE E1.Name 
END AS [Name] 
FROM #Emp E1 
LEFT OUTER JOIN #Emp E2 ON E1.EmpId = E2.EmpIdRef 
WHERE E1.EmpIdRef IS NULL 
0

Как вы говорите, что вы можете закодировать так:

SELECT empidref AS Empid , Name 
FROM Emp 
WHERE empidref IS NOT NULL 
-- Select empidref where it is not null 
UNION ALL 
-- Merge it with 
SELECT empid , Name 
FROM Emp 
WHERE empidref IS NULL 
-- Select empid where empidref is null 
    AND empid NOT IN (SELECT empidref 
         FROM Emp 
         WHERE empidref IS NOT NULL) 
-- And empid is not in previous select 

Другой способ использует ROW_NUMBER() так:

SELECT empid, Name 
FROM (
    SELECT COALESCE(empidref, empid) as empid, Name, 
     ROW_NUMBER() OVER (PARTITION BY COALESCE(empidref, empid) ORDER BY empidref DESC) AS seq 
    FROM Emp) t 
WHERE seq = 1 

В приведенном выше запросе я сказал, что COALESCE(empidref, empid), как когда empidref является null, то используйте empid и создайте столбец последовательностей - от 1 - для каждого COALESCE(empidref, empid), который отсортирован по убыванию по empidref, чтобы получить нулевые значения после не нулевых значений, а затем отфильтровать этот секвенсор e для 1, потому что мне нужно только первое не пустое значение.

0

попробовать это,

select isnull(empidref,empid) as empid,name 
from emp where 
empid not in (select empidref from emp where empidref is not null) 
Смежные вопросы