我有兩個表,我需要根據過濾器 ID 過濾資料取決于過濾器組 ID 的關系。
例如我有這兩個表:
表格1:
| 物品編號 | 過濾器ID |
|---|---|
| 3 | 122 |
| 3 | 123 |
| 3 | 4 |
| 17 | 123 |
表 2:
| 過濾器ID | 過濾器組ID |
|---|---|
| 122 | 5 |
| 123 | 5 |
| 4 | 1 |
- 如果我按過濾器 id = 123 搜索,則需要回傳帶有此過濾器的所有專案 ID。
- 如果我搜索兩個或多個具有不同組 ID 的不同過濾器 ID,我只需要獲取具有所有過濾器 ID 和組 ID 的專案 ID。
期望的輸出:
- 第一個輸入:123 -> 回傳 item id =3 和 item id = 17
- 第二個輸入:123,4 -> 回傳專案 ID = 3 因為過濾器 ID 123 屬于組 ID 5,過濾器 ID 4 屬于組 ID 1,而專案 ID 3 是唯一具有這兩個過濾器的過濾器。
- 第三個輸入:122,123 -> 回傳 item id =3 和 item id = 17 因為兩個過濾器 id 屬于同一組。
我對這個查詢有點迷茫,我很高興得到一些幫助。
我會盡量簡化它:假設我們有大小的組過濾器和顏色的組過濾器。如果我按尺寸 S 或 M 過濾,那么我需要獲得具有此尺寸的所有專案。如果我想添加像藍色這樣的顏色,那么答案將通過以下方式削減結果:尺寸為 S 或 M 且顏色為藍色的專案。所以從不同組過濾可能會減少一些結果
uj5u.com熱心網友回復:
看來,想要讓每一個ItemID具有至少一個從匹配濾波器每個 FilterGroupID篩選器的輸入范圍內。所以在每個組內你有or邏輯,在組之間你有and邏輯
如果您將輸入存盤在表變數或表值引數中,那么您可以只使用普通的關系除法技術。
這就變成了一個Relational Division With Remainder 的問題,有多個除數。
有很多方法可以切片這個蛋糕。這是一種選擇
- 將過濾器輸入加入組,以獲取每個過濾器的組 ID
- 使用的組合
DENSE_RANK,并MAX得到總的不同分組(不能使用COUNT(DISTINCT在一個視窗函式,所以我們需要破解的話)- 您可以更改此步驟以使用子查詢而不是視窗函式。它可能更快或更慢
- 加入主表,并過濾掉所有
ItemID不同組總數與主總數不同的 s
SELECT
t1.ItemID
FROM (
SELECT *,
TotalGroups = MAX(dr) OVER ()
FROM (
SELECT
fi.FilterID,
t2.FilterGroupID,
dr = DENSE_RANK() OVER (ORDER BY t2.FilterGroupID)
FROM @Filters fi
JOIN Table2 t2 ON t2.FilterID = fI.FilterID
) fi
) fi
JOIN Table1 t1 ON t1.FilterID = fi.FilterID
GROUP BY
t1.ItemID
HAVING COUNT(DISTINCT FilterGroupID) = MAX(fi.TotalGroups);
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371995.html
標籤:sql sql-server sql-server-2008 子查询
