如何从1个表中获取逗号分隔数据并从另一个表中获取相关数据?

时间:2010-12-23 15:38:02

标签: sql sql-server sql-server-2008

我有1个表,其中存储了类别。 例如:

CategoryId      CategoryName
-------------------------------
1              General

2              dummy

3              test

现在我有另外一张表,我在其中存储文章,在该表中我用逗号分隔值存储文章ID,因为1篇文章可以在1个以上的类别中

ArticleID       Content       CategoryId
-------------------------------------------
1              Test            1,2
2              Test2           1,3
3              Test3           1,2,3
4              Test4           2

现在在我显示文章的前端我也要显示文章categoryname。

那么你能告诉我怎样才能实现这个目标?

输出应该像::

ArticleId      Content        Category
------------------------------------------
1             Test             General,dummy
2             Test2            General,test
3             Test3            General,dummy,test
4             Test4            dummy

3 个答案:

答案 0 :(得分:3)

也许您应该考虑更改数据模型。

创建一个额外的表Article_Category(ArticleID,CategoryID),并为文章所属的每个类别的每一篇文章添加一行。

然后查询成为三个表的简单连接。按文章和类别对输出进行排序,您可以轻松地“压缩”GUI中的输出。

答案 1 :(得分:0)

在MySQL中,您可以使用GROUP_CONCAT聚合函数执行此操作。我不认为在T-SQL中有类似的东西,但你可以在搜索中使用它。以下是有人询问此问题的示例:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/f09d4166-2030-41fe-b86e-392fbc94db53

祝你好运!

答案 2 :(得分:0)

如果你知道某些.NET,你可以创建类似StringAggregator的东西。你以前的问题表明你确实知道一些编程。

创建SQL Server 2005/2008项目并使用此代码

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Collections.Generic
Imports System.IO

<Serializable()> _
<Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize:=8000)> _
Public Structure StringAggrComma
    Implements IBinarySerialize

    Private values As List(Of String)

    Public Sub Init()
        ' Put your code here
        values = New List(Of String)
    End Sub

    Public Sub Accumulate(ByVal value As SqlString)
        ' Put your code here
        values.Add(value.Value.Trim)
    End Sub

    Public Sub Merge(ByVal value As StringAggrComma)
        ' Put your code here
        For Each val As String In value.values
            Accumulate(val)
        Next
    End Sub

    Public Function Terminate() As SqlString
        ' Put your code here
        Return New SqlString(String.Join(", ", values.ToArray))
    End Function

    Public Sub Write(ByVal w As System.IO.BinaryWriter) Implements Microsoft.SqlServer.Server.IBinarySerialize.Write
        w.Write(values.Count)
        For Each item As String In values
            w.Write(item)
        Next
    End Sub

    Public Sub Read(ByVal r As System.IO.BinaryReader) Implements Microsoft.SqlServer.Server.IBinarySerialize.Read
        values = New List(Of String)
        For i As Int32 = 0 To r.ReadInt32
            values.Add(r.ReadString)
        Next
    End Sub
End Structure