Sql 查询以获取包含来自另一个 table 的多个 ID 的项目

Sql Query to get an item that contains multiple ids from another table

我有三个 table。 容器、库存和 SKU

容器table

ContainerId
C1
C2
C3

库存Table

库存编号 斯库 容器
I1 S1 C1
I2 S1 C2
I3 S2 C1

SKU Table

SkuId
S1
S2
S3

我需要创建一个 sql 查询,该查询将 return 包含所有给定 SKU id 的容器。 因此,如果我想要具有 SKU S1 的容器,我的结果应该是 C1 和 C2 但是如果我想获得具有 SKU id S1 和 S2 的容器,我唯一的结果应该是 C1。 C2应该不是结果,因为它没有S2。

到目前为止我试过的查询是

SELECT distinct containerId FROM Container c 
   JOIN Inventory i ON i.Container = c.ContainerId
   JOIN SKU s ON s.SkuId = i.Sku
   WHERE s.SkuId IN (S1, S2)

但是 WHERE IN 语句是一个 shorthanded OR,所以它也会 return C2 作为结果,因为它包含 S1。

我知道没有办法 shorthand AND 条件但是有没有类似的方法或可能的方法来做到这一点?

您使用 group by 并使用 count 来验证是否存在所有必需的 SKU,而不是 distinct:

SELECT c.ContainerId
FROM Container c 
JOIN Inventory i ON i.Container = c.ContainerId
JOIN SKU s ON s.SkuId = i.Sku AND s.SkuId in (S1, S2)
GROUP BY c.ContainerId
HAVING COUNT(DISTINCT s.SkuId)=2

但是,正如其他人评论的那样,没有必要使用任何 table 但库存:

SELECT i.Container
FROM Inventory i
WHERE i.Sku in (S1, S2)
GROUP BY i.Container
HAVING COUNT(DISTINCT i.Sku)=2

对于您在问题中指定的结果,此查询实际上不需要任何联接:

SELECT i.Container
FROM Inventory i 
WHERE i.Sku in (S1, S2)
GROUP BY i.Container
HAVING COUNT(i.Sku) = 2;

你只需要 COUNT(DISTINCT) 如果一个容器可以有多个相同的行 SkuId