2014-02-17 58 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 

感謝提前..

+0

在以一個峯值COALESCE()函數。 https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce –

回答

0

如何自加入?因此,像

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

基於這樣的事實,你已經選擇你可能想看看

的MySQL IFNULL 3級的RDBMS:

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

SQL服務器ISNULL

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

我會嘗試,但第一個示例查詢不起作用錯誤: - 多部分標識符「tTo.id 「不能被束縛。 – user3320373

+0

對不起,從'tTo'更改爲'rTo' –

1

保持連接和子選擇出你的選擇語句。

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

這應該是工作......你已經用3個獨立的數據庫標記你的問題,每個數據庫的語法略有不同。選擇一個......你使用哪個數據庫? – Twelfth

0

在SQL Server:

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