【问题标题】:How to Join single table to it self in SQL Server 2008?如何在 SQL Server 2008 中将单个表连接到自身?
【发布时间】:2014-08-26 13:29:07
【问题描述】:

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

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

【问题讨论】:

  • 到目前为止你尝试过什么?这个问题的所有方面在谷歌上都很容易找到。
  • 这不是特别容易解决的。问题是数据没有正确标准化。您应该有一个单独的“ReportsTo”表,每个员工一行,ReportTo。你能改变数据结构吗?
  • @GordonLinoff 是的,你是对的,但是有没有其他方法可以使用 Sql View 来完成这个?

标签: c# sql sql-server-2008


【解决方案1】:

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

您的问题是您在表中存储了一对多的关系,这是一个巨大的设计错误。对于未来,请记住,每当您考虑将信息存储为逗号分隔的列表时,那么您做错了,需要一个相关的表来代替。因此,首先您必须将数据拆分到您应该拥有的相关表中,而不是使用两列,EmplCode 和 ReportsTo(在报告中只有一个值),然后您可以像任何其他联接一样进行联接。当我们在客户端文件中获得此类信息时,我们使用您可以通过在 Internet 上搜索获得的功能 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】:

    据我所知,我认为您正在尝试使用逗号分隔 Firstname 列和 ReportsTo 列:

    SELECT FirstName + ', ' + ReportsTo
    FROM table
    

    编辑:从 cmets 来看,他正在尝试做其他事情?谁能帮我改一下?

    【讨论】:

      【解决方案3】:
      SELECT  E.*,
              R.FirstName
      FROM    Employees E
              JOIN Employees R
                  ON E.ReportsTo LIKE '%' + R.EmpCode + '%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多