SQL级联多对多

扫码查看

我有三个这样的表:

项目:

分类目录

和一个简单的MtM表将它们连接起来

出于报告目的,我一直想知道是否有可能创建一个包含该项目所属的所有类别的串联的字段。例如,如果项目ID = 1属于类别ID = 1和ID = 2,则为0。我可以在Items上进行选择,并获得一个值为'Schuhe;的字段'Categories';亨德

仅使用SQL完全有可能吗?

我能想到的最好的

SELECT Items.*, Categories.CategoryName
FROM (CategoryItemAffinities
      INNER JOIN Categories ON CategoryItemAffinities.CategoryID = Categories.ID)
INNER JOIN Items ON CategoryItemAffinities.ItemID = Items.ID;

但这显然可以为每个项目产生一个以上的结果

[编辑]
只是要指定,ms Access 仅仅是数据库引擎,我本身并没有使用 Access 表单/报告等。我需要C#应用程序

最佳答案

Jet DB不包含用于字符串连接的聚合函数。您可以创建自己的函数来执行所需的操作。首先,您希望数据具有类别的itemID和STRING值,例如:

yourTableOrQueryName

然后编写一个自定义函数,如下所示:

Public Function getCats(theID)
    Dim rs As Recordset
    Dim db As Database
    Dim qstr As String
    Dim returnString As String

    qstr = "SELECT category FROM yourTableOrQueryName WHERE itemID = " & theID

    Set db = CurrentDb
    Set rs = db.OpenRecordset(qstr)

    Do While Not rs.EOF
        returnString = returnString & ", " & rs!Category
        rs.MoveNext
    Loop

    getCats = Mid(returnString, 3, Len(returnString) - 2)

End Function

然后,您的查询如下所示:
SELECT itemID, getCats([itemID]) AS catList
FROM yourTableOrQueryName
GROUP BY itemID;

可以对该查询进行优化,以使它不会对每个ID运行多次,方法是嵌套一个选择唯一查询,该查询仅在运行“getCats()”函数之前获取您的唯一ID(如果您要精减毫秒),但是我离开了那给你。

结果:

10-05 20:51
查看更多