我有两个包含类别和日期的表。
表 1:
cat date
A 20160102
A 20160103
A 20160104
B 20170202
B 20170203
B 20170204
表 2:
cat date
A 20160103
A 20160104
A 20160105
B 20170203
B 20170206
B 20170207
我现在想要从表 1 中删除日期等于或晚于每个类别表 2 的最早日期的所有行.
类别 A 的最早日期是20160103
。类别 B 的最早日期是20170203
。因此,条目 ('A','20160103')
、('A','20160104')
和 ('B','20170204' )
应从表 1 中删除。
为了进行测试,我尝试创建一个 SELECT
语句来选择我要删除的值。目前我想出了这个:
SELECT
t1.id
,t1.holiday
,MIN(t2.holiday)
FROM
table1 t1
INNER JOIN table2 t2
ON t2.id = t1.id
GROUP BY
t1.id
,t1.holiday
(对我来说)下一个逻辑步骤是添加以下 WHERE
子句
SELECT
t1.id
,t1.holiday
,MIN(t2.holiday)
FROM
table1 t1
INNER JOIN table2 t2
ON t2.id = t1.id
WHERE
t1.holiday >= MIN(t2.holiday)
GROUP BY
t1.id
,t1.holiday
但是,这会产生以下错误:
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.
如何解决这个问题?
最佳答案
这回答了第一个问题(关于从表 1 中删除)
DELETE t1
FROM Table1 AS t1
INNER JOIN (
SELECT
cat,
min_date=MIN([date])
FROM
Table2
GROUP BY
cat
) AS t2 ON
t2.cat=t1.cat
WHERE
t1.[date]>=t2.min_date
关于sql-server - 基于JOIN和聚合条件的SQL DELETE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40510520/