C# 在SQLServer2008中如何将单个表连接到它自身?

C# 在SQLServer2008中如何将单个表连接到它自身?,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,我正在使用下表结构,我想创建一个视图,该视图将显示下面显示的reports to字段的FirstName 请允许我给出一个建议,如何创建一个视图,该视图将使用(“,”)逗号分隔符显示所有报告到的名字。根据我收集的信息,我认为您正在尝试使用逗号分隔名字列和报告到列: SELECT FirstName + ', ' + ReportsTo FROM table 编辑:从评论来看,他想做些别的事?有人能给我换个说法吗?从我收集的信息来看,我想你是想让Firstname列和ReportsTo列用逗号

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


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

根据我收集的信息,我认为您正在尝试使用逗号分隔名字列和报告到列:

SELECT FirstName + ', ' + ReportsTo
FROM table

编辑:从评论来看,他想做些别的事?有人能给我换个说法吗?

从我收集的信息来看,我想你是想让Firstname列和ReportsTo列用逗号隔开:

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

编辑:从评论来看,他想做些别的事?有人能给我换个说法吗?

从我收集的信息来看,我想你是想让Firstname列和ReportsTo列用逗号隔开:

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

编辑:从评论来看,他想做些别的事?有人能给我换个说法吗?

从我收集的信息来看,我想你是想让Firstname列和ReportsTo列用逗号隔开:

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

编辑:从评论来看,他想做些别的事?有人能给我换个说法吗?

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

SELECT  E.*,
        R.FirstName
FROM    Employees E
        JOIN Employees R
            ON E.ReportsTo LIKE '%' + R.EmpCode + '%'
您的问题是表中存储了一对多关系,这是一个巨大的设计错误。将来,请记住,任何时候您考虑将信息存储在逗号删除列表中,那么您就错了,需要一个相关的表。因此,首先,您必须将数据拆分到本应具有的相关表中,该表包含两列,empCode和ReportsTo(reports to中只有一个值),然后您可以像其他任何联接一样进行联接。当我们在客户端文件中获取此类信息时,我们使用一个名为fn_split的函数,可以通过在internet上搜索来拆分此类表

如果您搜索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

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

您的问题是表中存储了一对多关系,这是一个巨大的设计错误。将来,请记住,任何时候您考虑将信息存储在逗号删除列表中,那么您就错了,需要一个相关的表。因此,首先,您必须将数据拆分到本应具有的相关表中,该表包含两列,empCode和ReportsTo(reports to中只有一个值),然后您可以像其他任何联接一样进行联接。当我们在客户端文件中获取此类信息时,我们使用一个名为fn_split的函数,可以通过在internet上搜索来拆分此类表

如果您搜索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

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

您的问题是表中存储了一对多关系,这是一个巨大的设计错误。将来,请记住,任何时候您考虑将信息存储在逗号删除列表中,那么您就错了,需要一个相关的表。因此,首先,您必须将数据拆分到本应具有的相关表中,该表包含两列,empCode和ReportsTo(reports to中只有一个值),然后您可以像其他任何联接一样进行联接。当我们在客户端文件中获取此类信息时,我们使用一个名为fn_split的函数,可以通过在internet上搜索来拆分此类表

如果您搜索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

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

您的问题是表中存储了一对多关系,这是一个巨大的设计错误。将来,请记住,任何时候您考虑将信息存储在逗号删除列表中,那么您就错了,需要一个相关的表。因此,首先,您必须将数据拆分到本应具有的相关表中,该表包含两列,empCode和ReportsTo(reports to中只有一个值),然后您可以像其他任何联接一样进行联接。当我们在客户端文件中获取此类信息时,我们使用一个名为fn_split的函数,可以通过在internet上搜索来拆分此类表

如果您搜索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

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