2015-03-31 23 views
2

獲取產品產品如下表從組合

enter image description here

說用戶需要組件的組合,以獲得產品加鍵考慮。如果用戶輸入系統將只顯示冰茶,而不是冰鎮奶茶(或具有冰作爲其組成部分的其他可能的產品)。如果用戶只輸入冰塊作爲組件,它將僅顯示冰塊作爲產品。如果用戶僅輸入巧克力,則不需要返回任何結果,因爲組件的組合不會與產品相加,並且不存在其他產品,而巧克力作爲其唯一部件存在。

產品和組件的組合是獨特的。沒有其他產品具有相同的組件。意思是冰,茶和牛奶只會生產冰奶茶。

我有點卡住了來到一個查詢(MSSQL)得到我想要的結果。我可以看到組合和流程,但不知道要使用的確切查詢。

有人可以提出/指出正確的方向嗎?

謝謝你們的關注。 :) :) :) xoxoxox

補充:從產品 enter image description here

+0

請給我們您的表模式。 「Products」,「Component」和「ComponentsInProduct」表的定義是什麼? – Dai 2015-03-31 03:57:18

+1

嗨戴,其實在一張桌子 – Khairul 2015-03-31 03:59:06

+0

怎麼可能在一張桌子上?請給我們你的表格架構。這是否正規化? – Dai 2015-03-31 04:06:44

回答

3

表模式 enter image description here

選擇*這是一個關係司沒有餘(RDNR)問題。 Dwain Camps見article,爲這類問題提供了許多解決方案。

您還需要一個字符串拆分器來拆分逗號分隔的組件變量。這是Jeff Moden的DelimitedSplit8K函數。

DECLARE @components VARCHAR(100) = 'ice,tea'; 
DECLARE @component TABLE(Component VARCHAR(100)); 

INSERT INTO @component 
    SELECT Item 
    FROM dbo.DelimitedSplit8K(@components, ',') 


SELECT 
    t.Product 
FROM(
    SELECT Product, CNT = COUNT(*) 
    FROM Product 
    GROUP BY Product 
)t 
INNER JOIN(
    SELECT CNT = COUNT(*) FROM @Component 
)s 
    ON s.CNT = t.CNT 
INNER JOIN Product p 
    ON p.Product = t.Product 
INNER JOIN @component c 
    ON c.Component = p.Component 
GROUP BY t.Product 
HAVING COUNT(*) = MIN(s.CNT) 

SQL Fiddle


@Tim Biegeleisen,這裏是一個更簡單的方法:

SELECT 
    p.Product 
FROM Product p 
WHERE p.Component IN('Ice','Tea') 
GROUP BY p.Product 
HAVING 
    COUNT(Component) = 2 
    AND COUNT(Component) = (SELECT COUNT(*) FROM Product WHERE Product = p.Product) 

SQL Fiddle

+0

謝謝你的回答wewesthemance。現貨與我想要的。 – Khairul 2015-03-31 06:53:33

+0

@Khairul,沒問題。一定要閱讀這兩篇文章。 – 2015-03-31 06:55:19