无法创建预期查询

时间:2014-02-17 18:38:43

标签: mysql sql oracle sql-server-2008 sql-server-2005

我是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

非常感谢..

3 个答案:

答案 0 :(得分:1)

将select连接和子选择保留在select语句之外。

MySQL和Oracle是两个独立的数据库......选择或其他

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

将给出名称..使用isnull语句来解决找到bnot时的“无人”。请注意,左连接使这成为可能,内连接在此处不起作用。

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

答案 1 :(得分:0)

自我加入怎么样?像

这样的东西
SELECT r.Name ,
    rTo.Name Reporter
FROM testLevel r LEFT JOIN
     testLevel rTo ON r.ReportingTo = rTo.id

基于您选择3个RDBMS的事实,您可能需要查看

MySQL IFNULL

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

SQL Server ISNULL

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

答案 2 :(得分: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