代码之家  ›  专栏  ›  技术社区  ›  prog1011

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

  •  0
  • prog1011  · 技术社区  · 11 年前

    我正在使用下表结构,我想创建一个视图,该视图将显示 FirstName 属于 ReportsTo 字段显示如下。

    Table Structure

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

    3 回复  |  直到 11 年前
        1
  •  1
  •   HLGEM    11 年前

    您可以像任何其他联接一样将表联接到自身。主要是确保两个表都使用不同的别名

    您的问题是表中存储了一对多关系,这是一个巨大的设计错误。对于未来,请记住,每当您考虑将信息存储在一个逗号分隔的列表中时,您就做错了,需要一个相关的表。因此,首先必须将数据拆分到相关的表中,而不是使用两列: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
    
        2
  •  1
  •   Corey Thompson    11 年前

    从我收集到的信息来看,我认为您正在尝试用逗号分隔Firstname列和ReportsTo列:

    SELECT FirstName + ', ' + ReportsTo
    FROM table
    

    编辑:从评论来看,他想做点什么?有人能替我换个说法吗?

        3
  •  1
  •   Giannis Paraskevopoulos    11 年前
    SELECT  E.*,
            R.FirstName
    FROM    Employees E
            JOIN Employees R
                ON E.ReportsTo LIKE '%' + R.EmpCode + '%'