Sql查询从另一个表中获取包含多个id的项目

时间:2021-06-28 19:12:48

标签: mysql sql sql-query-store

我有三张桌子。 容器、库存和 SKU

容器表

<头>
ContainerId
C1
C2
C3

库存表

<头>
库存Id Sku 容器
I1 S1 C1
I2 S1 C2
I3 S2 C1

SKU 表

<头>
SkuId
S1
S2
S3

我需要创建一个 sql 查询,该查询将返回包含所有给定 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 语句是一个简写的 OR,因此它也会返回 C2 作为结果,因为它包含 S1。

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

2 个答案:

答案 0 :(得分:0)

您使用 group by 和 count 来验证所有必需的 skus 是否都存在:

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

但是,正如其他人所评论的,除了 Inventory 之外,不需要使用任何表:

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

答案 1 :(得分:0)

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

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

如果容器可以有多个行用于同一个 COUNT(DISTINCT),您只需要 SkuId