如何在SQL Server 2008中将单个表连接到自身?

时间:2014-08-26 13:29:08

标签: c# sql sql-server-2008

我正在使用下面的表格结构,我想创建一个显示FirstName ReportsTo字段的视图。

Table Structure

请让我建议如何创建该视图,该视图将使用(',')逗号分隔符显示所有报告的名字。

3 个答案:

答案 0 :(得分:1)

根据我收集的内容,我认为您正在尝试将逗号分隔的Firstname列和ReportsTo列分隔开来:

SELECT FirstName + ', ' + ReportsTo
FROM table

编辑:根据他试图做其他事情的评论判断?有人可以为我改写吗?

答案 1 :(得分:1)

SELECT  E.*,
        R.FirstName
FROM    Employees E
        JOIN Employees R
            ON E.ReportsTo LIKE '%' + R.EmpCode + '%'

答案 2 :(得分:1)

您可以像其他任何联接一样将表连接到自身。这主要是为了确保两个表都有别名的别名

你的问题是你在表中存储了一对多的关系,这是一个巨大的设计错误。对于未来,请记住,只要您考虑将信息存储为逗号分隔列表,那么您做错了并需要相关的表。因此,首先必须将数据拆分到相应的表中,而不是使用两列EmplCode和ReportsTo(报告中只有一个值),然后就可以像任何其他连接一样进行连接。我们使用一个函数,你可以通过搜索fn_split在互联网上搜索,以便在我们在客户端文件中获得此类信息时拆分这些表。

如果您搜索fn_split,那么这就是您应用它的方式:

Create table  #UnsplitData (EmpCode varchar (10), ReportsTo varchar(20), FirstName varchar (10)) 
insert into #UnsplitData
values ('emp_0101', 'emp_0102,emp_0103', 'John')
, ('emp_0102', 'emp_0103', 'Sally')
, ('emp_0103', Null, 'Steve')



select *, employee.FirstName + ', ' + Reports.FirstName
from  #UnsplitData Employee 
join 
(
    select t.EmpCode , split.value  as Reportsto, ReportName.Firstname
    from  #UnsplitData t
    cross apply dbo.fn_Split( ReportsTo, ',') split
    join #UnsplitData ReportName 
        on ReportName.EmpCode = split.value
) Reports
    On Employee.EmpCode = Reports.empcode