2014-01-27 32 views
0

我有一個基本的許多一對多表是:查詢上的許多與多種或多個表/ AND

tbFilter 
filterId | filterName 


tbProduct 
productId | productName 


tbProductFilter 
filterId | productId 

所以,我有很多產品與許多過濾器(顏色,大小等) 。現在,我需要創建一個程序來查找具有一些過濾器組合的產品,例如: 所有產品是(藍色或綠色)和(大型OR大型)和(forMen)

我發現創建此查詢包含同一個表的多個連接,每個連接用於「組」篩選器或多個子查詢,每個用於一個組。最大的問題是多對多的表有更多的10萬條記錄,所以這種方法表現不佳。

如何做這個查詢的最佳方法?我使用的是SQL 2012

感謝

這是我得到現在的工作:

select [produtos].* FROM [dbo].[tbProdutos] AS [produtos] JOIN [dbo].tbJuncaoProdutoCategoria] AS [juncaoProdutoCategoria] ON [produtos].[produtoId] = juncaoProdutoCategoria].[produtoId] JOIN [dbo].[tbJuncaoProdutoCategoria] AS juncaoProdutoCategoria2] ON [produtos].[produtoId] = [juncaoProdutoCategoria2].[produtoId] JOIN [dbo].[tbProdutoCategoria] AS [produtoCategoria] ON [produtoCategoria].[categoriaId] = [juncaoProdutoCategoria].[categoriaId] where [juncaoProdutoCategoria].categoriaId = 1 AND ([juncaoProdutoCategoria2].categoriaId = 300 OR [juncaoProdutoCategoria2].categoriaId = 301) 
+0

你對這些表是什麼指標?此外,你可以顯示你正在嘗試這個例子的查詢嗎? – PinnyM

+0

我剛剛發送了我現在使用的查詢。我正在尋找的是一種更好的方法,我不需要在每個過濾器「組」中加入聯繫 – user1592608

回答

0

把過濾器爲表(或表值參數),加入該對產品篩選表,組按產品分類,並統計加入的獨特過濾器。

這種方法可以處理的過濾器的任意值,然後進行模糊匹配,即「告訴我符合這三個四個過濾器中,該產品」

DECLARE @filterCount int = 3 
DECLARE @filterSet TABLE (filterNum int, filterName varchar(max)) 

INSERT @filterSet VALUES 
    (1,'blue'),(1,'green'), 
    (2,'large'),(2,'xlarge'), 
    (3,'forMen') 

SELECT pf.ProductId 
FROM tbProductFilter pf 
INNER JOIN tbFilter f ON f.filterId = pf.filterId 
INNER JOIN @filterSet s ON s.filterName = f.filterName 
GROUP BY pf.productId 
HAVING COUNT(DISTINCT s.filterNum) = @filterCount 
+0

謝謝!我做了一個快速測試,我認爲這將完全符合我的需要。我將在SP中進行轉換並進行一些性能測試! – user1592608

0

首先,你肯定要檢查你的索引 - 你在想索引所有外鍵字段以及fitlerName。

假設你的索引是在良好的狀態,這裏是你可以做這樣一個方法:

SELECT p.*  -- preferably just select the fields you need here... 
FROM products p 
WHERE p.productId IN (
    SELECT pf.product_id 
    FROM tbProductFilter pf 
    WHERE EXISTS (SELECT 1 FROM tbFilter f 
        WHERE pf.filterId = f.filterId AND f.filterName IN ('blue', 'green')) 
     AND EXISTS (SELECT 1 FROM tbFilter f 
        WHERE pf.filterId = f.filterId AND f.filterName IN ('large', 'xlarge')) 
     AND EXISTS (SELECT 1 FROM tbFilter f 
        WHERE pf.filterId = f.filterId AND f.filterName = 'forMen') 
) 
+0

感謝您的解決方案!這個倍數在tbProductFilter上的倍數是多少? – user1592608

+0

它可能 - 只有在嘗試和/或查看查詢計劃時才能完全確定。 – PinnyM