SQL DELETE 基于 JOIN 和聚合条件

SQL DELETE based on JOIN and aggregate condition

我有两个包含类别和日期的表。

Table 1:

cat date
A   20160102
A   20160103
A   20160104
B   20170202
B   20170203
B   20170204

Table 2:

cat date
A   20160103
A   20160104
A   20160105
B   20170203
B   20170206
B   20170207

我现在想删除 Table 1 中日期等于或晚于 最早日期 的所有行每个类别 Table 2

类别 A 的最早日期20160103。类别 B 的最早日期20170203。因此,条目 ('A','20160103')('A','20160104')('B','20170204') 应从 Table 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.

我该如何解决这个问题?

这回答了第一个问题(关于从 table 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