我是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 :(得分: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