sql-server - 基于JOIN和聚合条件的SQL DELETE

标签 sql-server t-sql 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。因此,条目 ('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/

相关文章:

c# - 能够更新数据集但无法提交对数据库的更改

c# - 将 SQL 列中的项目与数组进行比较

sql-server - 我们可以将 CASE 与 EXEC 一起使用吗

linux - Linux 和 Azure 数据库上的 freeTDS,登录问题

t-sql - 就像与参数一起使用一样,无法正常工作

python - Pandas 交叉表,但具有来自第三列聚合的值

mysql - 按百分比排序汇总结果?

sql-server - SQL Server : can you limit access to only one table

t-sql - 您可以在 JOIN w/SQL 上使用 LIKE 运算符进行更新吗?

mysql - 加快 2GB 以上单个表的 SQL 查询速度