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
我有两个包含类别和日期的表。
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