我有 3 個用這個名字命名的表
供應商:對于商店供應商資訊
| 供應商 ID | 名稱 |
|---|---|
| 1 | 供應商 1 |
| 2 | 供應商 2 |
| 3 | 供應商 3 |
| 4 | 供應商 4 |
產品 : 用于商店產品資訊
| 產品編號 | 名稱 |
|---|---|
| 1 | 產品一 |
| 2 | 產品 2 |
| 3 | 產品 3 |
| 4 | 產品 4 |
| 5 | 產品 5 |
供應商產品:供應商可以提供的商店產品
| 產品編號 | 供應商 ID |
|---|---|
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 2 | 2 |
| 3 | 2 |
| 4 | 2 |
| 3 | 3 |
| 4 | 3 |
| 1 | 4 |
| 2 | 4 |
| 4 | 4 |
我想撰寫一個查詢,獲取一堆產品 ID 并回傳具有所有此產品 ID(N:N 關系)的供應商 ID,例如獲取產品 ID 2,3 并僅回傳供應商 ID 1,2
uj5u.com熱心網友回復:
這是一個帶有多個除數的Relational Division With Remainder的問題。
首先,為了能夠為此做出好的解決方案,您需要以表格形式輸入資料。您可以為此使用表變數或表值引數。
有很多解決方案。這是一個常見的:
- 將輸入資料連接到
SupplierProduct表中。在您的情況下,您只需要Supplier資料,因此請在子查詢中執行此操作。 - 將其分組并檢查計數是否與輸入的總數匹配
DECLARE @ProductInput TABLE (ProductID int);
INSERT @ProductInput (ProductID) VALUES (2),(3);
SELECT *
FROM Supplier s
WHERE (SELECT COUNT(*)
FROM SupplierProduct sp
JOIN @ProductInput pi ON pi.ProductID = sp.ProductID
WHERE sp.SupplierID = s.SupplierID
) = (SELECT COUNT(*) FROM @ProductInput)
;
db<>小提琴
另一個常見的解決方案是 double NOT EXISTS。這將驗證沒有不匹配的輸入。它通常被認為效率較低。
DECLARE @ProductInput TABLE (ProductID int);
INSERT @ProductInput (ProductID) VALUES (2),(3);
SELECT *
FROM Supplier s
WHERE NOT EXISTS (SELECT 1
FROM @ProductInput pi
WHERE NOT EXISTS (SELECT 1
FROM SupplierProduct sp
WHERE pi.ProductID = sp.ProductID
AND sp.SupplierID = s.SupplierID
)
);
uj5u.com熱心網友回復:
您可以intersect按如下方式使用:
select distinct SupplierID
from SupplierProduct
where ProductID = 2
intersect
select SupplierID
from SupplierProduct
where ProductID = 3
小提琴
uj5u.com熱心網友回復:
試試這個:
DECLARE @Supplier TABLE (SupplierID int, Name varchar(50));
INSERT INTO @Supplier VALUES
(1, 'Supplier 1')
, (2, 'Supplier 2')
, (3, 'Supplier 3')
, (4, 'Supplier 4')
;
DECLARE @Product TABLE (ProductID int, Name varchar(50));
INSERT INTO @Product VALUES
(1, 'Product 1')
, (2, 'Product 2')
, (3, 'Product 3')
, (4, 'Product 4')
, (5, 'Product 5')
;
DECLARE @SupplierProduct TABLE (ProductID int, SupplierID int);
INSERT INTO @SupplierProduct VALUES
(2, 1)
, (3, 1)
, (4, 1)
, (2, 2)
, (3, 2)
, (4, 2)
, (3, 3)
, (4, 3)
, (1, 4)
, (2, 4)
, (4, 4)
;
DECLARE @ProductSelection TABLE (ProductID int)
INSERT INTO @ProductSelection
SELECT
ProductID
FROM @Product
WHERE 1=1
-- AND ProductID IN (2, 3) -- returns Suppliers 1, 2
-- AND ProductID IN (3, 4) -- returns Suppliers 1, 2, 3
AND ProductID IN (2, 4) -- returns Suppliers 1, 2, 4
;
WITH SupplierList AS
(
SELECT
RowNo = ROW_NUMBER() OVER (PARTITION BY SP.SupplierID ORDER BY SP.SupplierID)
, S.SupplierID
FROM @SupplierProduct SP
JOIN @ProductSelection P ON P.ProductID = SP.ProductID
JOIN @Supplier S ON S.SupplierID = SP.SupplierID
)
SELECT
SupplierID
FROM SupplierList
WHERE RowNo = (SELECT SUM(1) FROM @ProductSelection)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/425358.html
