2014-12-06 107 views
0

我正在使用MS Access 2003/2007。SQL自動擴展關係

這是一個簡化的場景,但希望有助於澄清。我有一個名爲TableAB表由2列如下:

TableAB

FieldA用於填充用戶窗體列表框多選,然後允許用戶選擇一個或多個項目進行搜索。然後使用所選項目搜索包含數千條記錄的單獨主表。

FieldB描述了FieldA中某些項目之間的4個關係集合(9,10,19和28),並允許我們自動擴展搜索選擇,如果單獨的「自動」用戶開關啓用。

例如,如果選擇的搜索項目是2,10和11,則自動擴展搜索將是2,10,11,25,26,34,66。這裏,25,26,34和66是自動包含的。

我可以自動展開使用上面的示例如下:

SELECT FieldA  
FROM TableAB  
WHERE FieldA In (2,10,11) Or FieldB In (2,10,11); 

我的問題:

當用戶選擇的特定關係的所有項目,但不會選擇說明主項(FieldB中的項目),那麼,我希望該項目被自動包含(不需要用戶切換,因爲應該總是包含缺失的項目)。

例如,如果用戶選擇23和24然後我想9被包括 - 但僅提供用戶輸入的兩個23和24

我可以使用返回主關係項目的下列作爲實例:

SELECT DISTINCT FieldB 
FROM tblABC   
WHERE (FieldA In (1,2,9,30,68) And FieldB <> Null) Or FieldB In(1,2,9,30,68); 

但我發現很難,因爲我有限的SQL知識,想辦法達到我的目的只是/優雅而不訴諸接口過多使用Visual Basic,這是我可以做的,但寧願不要。任何幫助/指針將不勝感激。

回答

1

我認爲以下查詢你想要做什麼:

SELECT FieldA  
FROM TableAB  
WHERE FieldA In (9) Or FieldB In (9) 
UNION 
SELECT FieldB 
FROM TableAB as ab 
GROUP BY FieldB 
HAVING SUM(IIF(FieldA in (9), 1, 0)) = COUNT(*) AND 
     COUNT(*) = (SELECT COUNT(*) FROM TableAB WHERE FieldA in (9) AND ab.FieldB = TableAB.FieldB) 

第二select增加了更高級別的關係。 having子句將檢查給定FieldB的所有值是否與您的列表相匹配,並且僅與您的列表匹配。

+0

感謝您的快速響應!在HAVING SUM(IIF(FieldA in(9),1,0))末尾放置缺少的右括號,結果與我想要的非常接近,但仍然存在問題。 「In(9)」將代替用戶選擇。如果我用(9)替代(23,24),那麼返回值是9,23,24 - 正是我想要的。但是,如果我輸入(23,24,68,69),那麼回報是23,24,68,69 - 它應該包括9和28. – Jim 2014-12-06 23:47:08

+0

@Jim。 。 。非常有趣的情況。如果您有多個完整的組,則原始查詢將不起作用。解決方案是一個相關的子查詢。我認爲認爲您的數據具有正確的相關性。 – 2014-12-06 23:50:14

+0

@戈登......很多人,非常感謝你在這裏的幫助。 用(9)代替(1,2,10,23,68,69)我得到1,2,10,23,25,26,28,34,66,68,69 ...我想要的一切,但是10是自動擴大到包括我不想要的25,26,34,66。用戶選擇同時存在於字段B中的條目的自動擴展需要被限制在用戶可以啓用或禁用的交換機上。我現在有這個設施在最後的strSQL構建之前在其他地方工作。 – Jim 2014-12-07 00:55:56

0

隨着@戈登的工作方案,我在想,我可以第一COUNT(*)後省略一切都進一步降低此給予以下,總的幫助: -

SELECT FieldA  
FROM TableAB  
WHERE FieldA In (1,10,23,24,68) Or FieldB In (1,10,23,24,68) 

輸出 - > 1,10,23,24,25,26,34,66,68(--->其中10自動擴展爲包括25,26,34,66)

Or FieldB In (1,10,23,24,68)是用戶自定義的,切換相關,並允許用戶使用匹配的字段B項目作爲關係鏈接自動展開到完整集合。 UserForm代碼將根據需要插入此可選分段。

我們從這個(即主要問題)中遺漏的是缺少的關係關鍵值 - 本例中的「9」。應該包括這個值,因爲所有關係項目即包括23和24

正如@戈登的解決方案(略減),我們將增加以下內容: -

UNION 
SELECT FieldB 
FROM TableAB 
GROUP BY FieldB 
HAVING SUM(IIF(FieldA In (1,10,23,24,68), 1, 0)) = COUNT(*); 

輸出 - > 9 ,並且兩個部分的總輸出結果恰好給了我想要的東西。

現在,如果我正確解碼,由於我們按FieldB分組,因此SUM(IIF(FieldA In (1,10,23,24,68), 1, 0))會計算每個項目的匹配FieldB匹配總數。然後,對於每個相應的FieldB項目,= COUNT(*)返回全部匹配的總數(即,該集合存在所有關係項目)。 HAVING將返回的數據集限制爲僅符合完全匹配條件的數據集。

- >大概是這樣,這裏發生了什麼事情,以這種方式減少戈登的解決方案是否安全?