我有两个包含类别和日期的表。
表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子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。
我该如何解决这个问题?
答案 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