2014-08-28 89 views
5

我有三个表是这样的:SQL级联多对多

项目:

enter image description here

分类

enter image description here

和简单的逐日盯表来连接它们

enter image description here

为了便于报告,我一直在想,是否有可能创建一个与该项目所属的所有类别连接的字段。例如,如果项目ID = 1将属于类别ID = 1和ID = 2;我可以对Items进行选择,并获得值'Schuhe'的字段'Categories'; Hemde'

这可能与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仅仅是数据库引擎,我本身不使用访问表格/报告等。我需要这个C#应用程序

+0

谷歌 “串连行与FOR XML PATH” – 2014-08-28 18:54:42

+0

@TabAlleman:这不会在MS Access – Andomar 2014-08-28 18:59:49

+0

@Andomar我是充满希望的,直到我看到您的评论飞: - (只是我想要的查询http://sqlandme.com/2011/04/27/tsql-concatenate-rows-using-for-xml-path/ – Robus 2014-08-28 19:05:21

回答

0

你可以通过代码循环一个记录集来输出你要找的结果,但这需要VBA或C#。 Access不支持像SQL Server这样的CTE,因此移除了另一个非常不错的选项。可能使用数据透视表并连接结果字段。会很棘手,但我相信它可以完成。

创建交叉表查询这样...

TRANSFORM First(Categories.CategoryNar) AS FirstOfCategoryNar 
SELECT MtM.ItemID 
FROM Categories INNER JOIN MtM ON Categories.ID = MtM.CategoryID 
GROUP BY MtM.ItemID 
PIVOT MtM.CategoryID; 

然后创建基于交叉表查询这样的查询...

SELECT Crosstab.ItemID, [1] & [2] & [3] AS ConcatField 
FROM Crosstab; 

的数字是CategoryIDs。

enter image description here

我希望这有助于。

1

Jet DB不包含字符串拼接的集合函数。你可以创建你自己的功能来做你需要的。首先,你要与ITEMID和类别的字符串值数据,因为这样的:

yourTableOrQueryName

DAta

然后写一个自定义函数,像这样:

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; 

通过在运行“getCats()”函数之前嵌套一个只获取唯一ID的选择唯一查询,可以优化该查询,使其不会针对每个ID运行多次,如果您正在修剪毫秒,但我把这些留给你。

结果:

resuklts