繁体   English   中英

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

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

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

集装箱桌

容器标识
C1
C2
C3

库存表

库存编号 单品 容器
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 条件,但是有没有类似的方法或可能的方法来做到这一点?

您使用 group by 和 count 来验证所有必需的 skus 是否存在,而不是 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

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

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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM