2015-10-19 63 views
1

我正在尋找類似FOR XML PATH( '')的MS Access。的MS Access 2013串聯行查詢

由於我只能讀取數據,但不會修改訪問文件/數據庫,查詢以外的所有內容都不適合我。

一個小細節:

我的目標是有一些查詢像下面,但使用的MS Access 2013:

SELECT 
    Items.Name, Items.Description , 
    (SELECT ItemValues.Value + ';' 
    FROM Itemvalues 
    WHERE Itemvalues.ItemID = [value] 
     AND someOtherConditions 
    FOR XML PATH ('')) AS Values 
FROM 
    Items 
WHERE 
    Items.ID = [value] 

如果項目值選擇的結果會是怎樣

SELECT ItemValues.Value 
FROM Itemvalues 
WHERE Itemvalues.ItemID = [value] 
    AND someOtherConditions 

輸出:

 itemval1 
    property2val 
    1234foo 

而且項目的結果選擇就會像

SELECT 
    Items.Name, Items.Description 
FROM 
    Items 
WHERE 
    Items.ID = [value] 

輸出:

Testitem | This is a test item 

我想有一個像

一個結果行
Testitem | This is a text test item | itemval1;property2val;1234foo; 

感謝您的幫助

PS:我已經看到關於這個話題的其他一些帖子,但是因爲這些都是很多你老人或不適合我的情況我正在嘗試我的運氣。

+0

我看到你已經爲這個問題添加了'.net'標籤。您打算運行此查詢的環境是什麼? C#? VB.NET? ...? –

+0

@GordThompson我將使用這個查詢與c# –

回答

2

考慮具有子查詢和嵌套在彙總查詢派生表下面的查詢。內部查詢計數的ItemValuesItemID號碼,然後外部查詢有條件通過[Name]Description使用計算次數輸出項目的值的串聯字符串聚集。

不幸的是,你需要明確地添加Max(IIF(...)查詢語句爲每個值要連接如下只使用三個從你的榜樣。見省略號。

請注意:此解決方案假定你有一個小學,自動編號ID[ItemValues]表:

SELECT Items.Name, Items.Description, 
     Max(IIF(ItemCount=1, t1.Value, NULL)) & ';' & 
     Max(IIF(ItemCount=2, t1.Value, NULL)) & ';' & 
     Max(IIF(ItemCount=3, t1.Value, NULL)) 
     ... As ItemValues  
FROM(
    SELECT Items.Name, Items.Description, t1.Value, 
      (SELECT Count(*) FROM ItemValues t2 
      WHERE t1.ItemID = t2.ItemID AND t1.ID >=t2.ID) As ItemCount 
    FROM Items INNER JOIN ItemValues t1 ON Items.ID = t1.ItemID 
) As derivedTable 
GROUP BY Items.Name, Items.Description; 

輸出

Name  Description   ItemValues 
Testitem This is a test item itemval1;property2val;1234foo 

順便說一句,你ItemsItemValues表似乎類似於其中多個數據項和類型存儲在單個列中的Entity-Attribute Value (EAV)模型。儘管它在極端標準化類型下實現高效存儲,但在數據庫設計中通常不推薦使用此模型。請參閱關於此主題的SO帖子:herehere。考慮修改後的表格模式以避免複雜的查詢。

+0

謝謝你廣泛回答,但因爲我不知道我會得到多少價值我不認爲我可以這樣做,我也不認爲我會被允許改變他們的數據庫結構當我甚至不允許添加一個模塊時 –

+0

你可以事先計算出這些值,然後添加'Max(IIF(...')行,甚至VBA也可以提供幫助,因爲它可以創建querydef,使用循環遍歷項 – Parfait

+0

是的,你是對的我會先查詢ItemValues,然後構建我的實際查詢來獲取數據,而不是在循環中使用循環............ –