我想查找所有没有库存 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
不应在store
和stockInfo
中重复。
此外,此查询或您的版本不需要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'