【问题标题】:SQL Server - Join QuerySQL Server - 加入查询
【发布时间】:2012-09-01 08:35:13
【问题描述】:

这是我的桌子

  StudentID    Name
    ----------   ------
      1          Mary
      2          John
      3          Peter
      4          Edwards

   ClassID      StudentIDs
    --------    -----------
      1          1,2
      2          3,4

    **Output Expected**

    ClassID   Names
    -------   -------

        1      Mary,John
        2      Peter,Edwards

【问题讨论】:

  • 如果你能做点什么,首先尝试标准化你的基础。使用 StudentIDs 之类的东西是一个非常糟糕的主意:值逗号分隔
  • 您需要先将 Class to Student 表中的值拆分为 1:1 ClassID to StudentID。一旦完成,这将是组之间的直接 INNER JOIN。然后,您需要将该数据打包回您的列中。在这个网站上有很多关于如何做到这一点的例子
  • @RaphaëlAlthaus 我无权更改表结构。在不更改表结构的情况下建议我解决方案...
  • 是的,我的主 ;) 说真的:你试过什么,你能给我们展示一个现有插入的例子,更新这个结构的查询吗?

标签: sql sql-server tsql sql-server-2005 join


【解决方案1】:

为此,您需要创建一个 SQL 函数。

Create Procedure GetStudent
as
  select ClassID , dbo.fnGetNamesById(StudentIDs) 
  from Table2
go

 create function fnGetNamesById (@psCSString as varchar(500))
  returns varchar(max)    
  as
Begin
    DECLARE @otTemp TABLE(sID VARCHAR(20))
    DECLARE @sTemp VARCHAR(100)

 WHILE LEN(@psCSString) > 0
    BEGIN
      SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
                        LEN(@psCSString)))
      SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
                                   LEN(@psCSString)) + 1, LEN(@psCSString))
      INSERT INTO @otTemp VALUES (ltrim(@sTemp))
    End
    set @sTemp = ''
    select @sTemp = @sTemp + Name from table1 where StudentID    in (select sID from @otTemp)

    return @sTemp
End

【讨论】:

    【解决方案2】:

    解决方案并不难,甚至你表中的信息似乎都没有正确存储:

    SELECT  ClassID
           ,(SELECT SUBSTRING((SELECT ',' + Name FROM @TableOne WHERE Students LIKE '%'+CAST(StudentID AS NVARCHAR(5))+'%' ORDER BY Name FOR XML PATH('')),2,200) AS CSV)
    FROM @TableTwo 
    

    您可以使用此代码(复制/粘贴)作为工作示例:

    DECLARE @TableOne TABLE
    (
        StudentID INT,
        Name NVARCHAR(100)
    )
    
    DECLARE @TableTwo TABLE
    (
        ClassID INT,
        Students NVARCHAR(100)
    )
    
    INSERT INTO @TableOne (StudentID,Name)
    VALUES  (1,'Mary')
           ,(2,'John')
           ,(3,'Peter')
           ,(4,'Edwards')
           ,(5,'Pepe')
           ,(6,'C.Ronaldo')
           ,(7,'Zidane')
           ,(8,'Raul')
    
    INSERT INTO @TableTwo (ClassID,Students)
    VALUES  (1,'1,3,5,6,8')
           ,(2,'2,4,7')
    
    
    SELECT  ClassID
           ,(SELECT SUBSTRING((SELECT ',' + Name FROM @TableOne WHERE Students LIKE '%'+CAST(StudentID AS NVARCHAR(5))+'%' ORDER BY Name FOR XML PATH('')),2,200) AS CSV)
    FROM @TableTwo 
    

    【讨论】:

      【解决方案3】:

      我强烈建议您更改在第二个表中存储 StudentID 的方式

      你可以这样做:

      ClassID      StudentIDs
          --------    -----------
            1          1
            1          2
            2          3
            2          4
      

      然后我们可以使用查询来获取输出

      SELECT ClassID , Names= 
          STUFF((SELECT ', ' + Names
                 FROM Studentb 
                 WHERE b.ClassID      = a.ClassID      
                FOR XML PATH('')), 1, 2, '')
      FROM Studenta
      GROUP BY ClassID      
      

      【讨论】:

      • 我无权更改表结构。在不更改表结构的情况下建议我解决方案...
      • @Madhu:你不必改变表结构,你只需要改变你在表中的存储方式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多