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++ 聚合没有虚函数?

r - 在 dplyr 中按组获取总和后计算列的行百分比

sql - 海量数据从SQL Server导出到VB中的Excel

python - 从聚合类别创建新列

c# - Dapper 如何通过 DynamicParameter.Get 处理 DBNull

sql - 需要一种更好的方法来将同一表行中的一个列值与多个列值进行比较

sql - 更新 SQL Server 2012 中的 varbinary(MAX) 字段丢失最后 4 位

sql-server - 添加具有先前选择的默认值的列

sql - 如何在 SQL 中对位列值取反

c# - 如何更新远程 ms sql server 上的数据库(EF 代码优先)