首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

集合論在 SQL 集合運算中的應用:子集、真子集與相等關係的查詢實作

     編輯:關於SqlServer

集合關係定義回顧

  • 相等:U ⊆ V 且 V ⊆ U
  • 子集:U 所有成員皆在 V 中
  • 真子集:U ⊂ V 且 V ⊄ U

情境:訂單與訂單明細

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 子句即能高效解決子集/超集/相等等查詢需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved