SQL - 查找所有不储存 2003 年 1 月 1 日之后生产的产品的商店

  • 本文关键字:查找 后生 日之 不储存 2003 SQL sql
  • 更新时间 :
  • 英文 :


我想查找所有没有库存 2003 年 1 月 1 日之后生产的产品的商店。

我目前有所有不同名称的商店。2003 年 1 月 1 日之后生产的一些库存产品,一些之前生产的库存产品,以及一些前后生产的库存产品。

我尝试的是

SELECT DISTINCT s.name FROM Store s
WHERE s.pcode NOT IN (
SELECT s2.pcode
FROM StockInfo s2
WHERE s2.productRelease BETWEEN "2003-01-01" AND NOW()
)

但是,这将返回在指定日期之前和之后生产的产品的商店以及仅在指定日期之前生产的产品的商店。

请有人帮助我解决这个问题。

这些表的结构为:

店铺

ID | name  
1  | Coles  
2  | Woolworths  

等。

股票信息

ID | name       | pcode | productRelease  
1  | Coles      | 1     | "2010-03-05"  
1  | Coles      | 3     | "2001-01-01"  
2  | Woolworths | 2     | "2003-01-01"

等。

使用not exists

SELECT s.name
FROM Store s
WHERE NOT EXISTS (SELECT 1
FROM StockInfo si
WHERE si.id = s.id AND
si.productRelease >= '2003-01-01'
);

据推测id商店的代码。 这应该被称为更具描述性的东西,如storeId,如果你可以控制数据模型。 同样,name不应在storestockInfo中重复。

此外,此查询或您的版本不需要SELECT DISTINCT

这里有一个建议。

SELECT  DISTINCT s.name 
FROM    Store s
JOIN    (SELECT ID
FROM StockInfo
GROUP BY ID
HAVING MAX(productRelease) <= '2003-01-01') s2
ON      s.ID = s2.ID

(提供结构和一些示例数据很有帮助。

由于StockInfo包含存储的列name,因此无需使用表Store
NOT EXISTS

SELECT DISTINCT s.name FROM StockInfo s
WHERE NOT EXISTS (
SELECT 1 FROM StockInfo
WHERE name = s.name AND productRelease > '2003-01-01'
)

或:

SELECT name 
FROM StockInfo
GROUP BY name
HAVING MAX(productRelease) <= '2003-01-01' 

最新更新