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
。
我有三个 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
。