SQL DELETE基于JOIN和聚合条件

时间:2016-11-09 15:27:44

标签: sql-server tsql aggregate aggregate-functions sql-delete

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

表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。因此,应从表1 中删除条目('A','20160103')('A','20160104')('B','20170204')

为了进行测试,我尝试创建一个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

然而,这会产生以下错误:

  

聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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