為了介紹我在本文中討論的問題,首先我們來回顧一下集合論中表示集合之間關系的幾個概念。我使用這些概念來為本文所討論的問題定義條件。我用大寫字母指定集合名稱,用編號的小寫字母指定集合成員,用裡面包含集合成員的花括號指定集合本身。
集合論描述了集合之間可以存在的某些關系:
•集合 U 等於集合 V,條件是:U 的所有成員都存在於 V 中,並且 V 的所有成員都存在於 U 中 - 例如,U = {u1, u2, u3},V = {u1, u2, u3}。
•如果 U 的所有成員都存在於 V 中,則 U 是 V 的子集。當 U 等於 V 時,U 是 V 的子集,V 也是 U 的子集。
•當 U 是 V 的子集,但 V 不是 U 的子集時,U 是 V 的真子集 - 例如,U = {u1, u2, u3},V = {u1, u2, u3, u4}。
我在本文中討論的任務涉及到確定與另一個項組有某種關系的項組,也就是集合。我們先來看一個提出問題的示例。
Orders 和 OrderDetails 方案
我使用的方案涉及到作為示例的 Orders 表和 OrderDetails 表,您可以運行 sqlmag03/Html/SetMembersandRelationshipsListing_01.txt" target="_blank">清單 1顯示的腳本在 tempdb 中創建並填充這兩個表。這些表只包括了與本文討論內容相關的列 - 即,Orders 中的 orderid 列和 OrderDetails 中的 orderid 和 productid 列。Orders 表中的每個訂單在 OrderDetails 表中可能不存在相關行;或存在一個或多個相關行,每一行都包含不同的產品。就其本質來說,每個定單都是實體的一個實例,但在本文中,我所指的定單是屬於定單的一組詳細信息。
應用程序用戶輸入一組代表新定單的產品,您的代碼將它們存儲在 #ProdList 臨時表中:
CREATE TABLE #ProdList(productid int NOT NULL PRIMARY KEY) INSERT INTO #ProdList VALUES(2) INSERT INTO #ProdList VALUES(3) INSERT INTO #ProdList VALUES(4)
您從市場營銷部門接受了幾個任務,要求您確定新定單和現有定單之間的不同關系。這些關系對於市場營銷部門可能很重要,營銷部門會據此確定采購模式,考慮某些產品組的折扣,等等。
任務 1:P 是 O 的子集。您的第一個任務是確定包含 #ProdList 中的所有產品的定單。用集合術語來說,如果 O 代表構成定單的定單詳細信息的集合,P 代表 #ProdList 中的產品的集合,您就要查找滿足“P 是 O 的子集”這一條件的定單。您的查詢應該返回定單 A 和 B。
下面的查詢為您提供了該任務的解決方案:
SELECT orderid FROM OrderDetails WHERE productid IN(SELECT productid FROM #ProdList) GROUP BY orderid