与另一个表的最大值合并

ukdjmx9f  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(469)

我有两个表:destinytableabq:在sourcetabla和其他数据中有一个最大值为periodo的列,如下所示:

  1. PERIODO DATE
  2. 202001 01/01/2020
  3. 202002 01/01/2020
  4. 202003 01/01/2020
  5. 202004 01/01/2020

还有一个源表,它有几百万条这样的记录:

  1. ANOMES
  2. 202001
  3. 202001
  4. 202001
  5. 202002
  6. ...
  7. 202005 --> Missed in the DestinyTablaBQ table, Needs to be inserted or updated`

我需要创建一个sql来插入或更新destinytablebq,使用来自源的max anomes值。
我使用merge创建了以下sql:

  1. MERGE [dbo].[DestinyTableBQ] BQ USING SourceTable T
  2. ON
  3. BQ.PERIODO=MAX(T.ANOMES)
  4. WHEN NOT MATCHED
  5. THEN
  6. INSERT (PERIODO,Date)
  7. VALUES(MAX(T.ANOMES),'');`

但我得到了以下错误:
聚合不能出现在on子句中,除非它在having子句或select列表中包含的子查询中,并且被聚合的列是外部引用
你知道我怎么用合并来做这个吗?或者不合并我该怎么做?
谢谢!!

ktca8awb

ktca8awb1#

你真的不需要 merge 语法,因为您所要做的就是插入一个不存在的值。我想用这种方式表达会更简单 insert ... select ... where not exists :

  1. insert into DestinyTablaBQ (periodo)
  2. select s.max_anomes
  3. from (select max(anomes) max_anomes from sourceTable) s
  4. where not exists (
  5. select 1 from DestinyTablaBQ bq where bq.periodo = s.max_anomes
  6. )

如果你想使用 merge 查询时,首先需要在子查询中进行聚合:

  1. merge DestinyTableBQ bq
  2. using (select max(anomes) max_anomes from sourceTable) s
  3. on (bq.periodo = s.max_anomes)
  4. when not matched then insert (periodo) values(s.max_anomes)

相关问题