2014-02-17 3 views
0

Я новичок в Sql Не могли бы вы помочь с этой проблемой.Не удалось создать ожидаемый запрос

 
id |name |reportingTo 
---------------------- 
1 A  NULL 
2 B  1 
3 C  1 
4 D  2 
5 E  2 
6 F  5 

Я хочу ожидаемый выход, как показано ниже. Как я могу внедрить это с помощью одного запроса.

 
Output 
------------------------ 
Name Reporter 

A   No One 
B   A 
C   A 
D   B 
E   B 
F   E 

Я попытался это, но не работает

select name,(case when reporting = null then 'MD' 
     ELSE (select a.name from testLevel a inner join testLevel b on a.id=b.reporting where a.id=b.reporting) 
     END) reportingto 
     From testLevel 

Благодаря In-заранее ..

+0

Возьмите пик на COALESCE(). https://dev.mysql.com/doc/refman/5.0/ru/comparison-operators.html#function_coalesce –

ответ

0

Как насчет себя присоединиться? Так что-то вроде

SELECT r.Name , 
    rTo.Name Reporter 
FROM testLevel r LEFT JOIN 
    testLevel rTo ON r.ReportingTo = rTo.id 

Основываясь на том, что вы выбрали 3 РСУБД вы можете захотеть взглянуть на

MySQL IFNULL:

IFNULL(rTo.Name, 'No One') Reporter 

SQL Server ISNULL

ISNULL(rTo.Name, 'No One') Reporter 
+0

Я попробую, но первый пример запроса не работает Ошибка: - Идентификатор с несколькими частями "tTo.id " не может быть связан. – user3320373

+0

Извините, изменено с 'tTo' на' rTo' –

1

Содержит соединения и подзапросы из вашего оператора select.

MySQL и Oracle являются два отдельными базами данных ... выбрать на или другой

select a.name, b.name 
from reportingto a left join reportingto b on a.id = b.reportingto 

что даст names..use в IsNull заявления, чтобы разрешить «никто», когда нашел BNOT. Обратите внимание, что левое соединение делает это возможным, внутреннее соединение здесь не будет работать.

select a.name, isnull(b.name, 'No One') 
from reportingto a left join reportingto b on a.id = b.reportingto 
+0

Не ожидаемый результат – user3320373

+0

Это должно работать ... вы отметили свой вопрос тремя отдельными базами данных, каждый из которых имеет слегка различающийся синтаксис. Выберите одну ... какую базу данных вы используете? – Twelfth

0

В SQL Server:

Вы также можете достичь этого с помощью Common Table Expression:

WITH CTE (
    SELECT DISTINCT reportingTo, name 
    FROM testLevel 
) 

SELECT DISTINCT A.name AS Name, ISNULL(B.name, 'No One') AS Reporter 
FROM testLevel A 
LEFT JOIN CTE B ON A.id = B.reportingTo 

Или с использованием подзапроса:

SELECT DISTINCT A.name AS Name, ISNULL(B.name, 'No One') AS Reporter 
FROM testLevel A 
LEFT JOIN (
    SELECT DISTINCT reportingTo, name 
    FROM testLevel 
) B ON A.id = B.reportingTo 
Смежные вопросы