我有三张桌子。 容器、库存和 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 条件,但有没有类似的方法或可能的方法来做到这一点?
答案 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
。