2014-08-28 96 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