Orders(orderid)、OrderDetails(orderid, productid)。使用者輸入產品清單 #ProdList(productid PK),需找出「包含清單中所有產品」的訂單,即 P ⊆ O。
SELECT orderid
FROM OrderDetails
WHERE productid IN (SELECT productid FROM #ProdList)
GROUP BY orderid
HAVING COUNT(DISTINCT productid) = (SELECT COUNT(*) FROM #ProdList);
原理:篩選屬於清單的明細行 → 依訂單分組 → 條件「符合清單的相異產品數 = 清單總數」即代表該訂單涵蓋所有輸入產品。
HAVING COUNT(DISTINCT productid) < (SELECT COUNT(*) FROM #ProdList)HAVING COUNT(DISTINCT productid) = (SELECT COUNT(*) FROM #ProdList) AND (SELECT COUNT(*) FROM OrderDetails WHERE orderid = o.orderid) = (SELECT COUNT(*) FROM #ProdList)NOT EXISTS (SELECT 1 FROM OrderDetails WHERE orderid = o.orderid AND productid IN (SELECT productid FROM #ProdList))集合論思維將複雜的「包含關係」轉化為可計數的彙總條件,配合
HAVING子句即能高效解決子集/超集/相等等查詢需求。