【发布时间】:2019-09-19 10:18:47
【问题描述】:
我的merge into 无法运行,因为“开启”条件无法识别表之间的一一对应关系。我想通过询问仅在条件失败的行来解决这个问题,使用第三列的值来决定。
merge into A using B
on (A.id = B.id and A.date between B.startdate and B.enddate)
when matched then update set
A.foo = B.foo
-- where B.tiecondition = 1 *
* 这不好,因为它总是运行,而我只想在主要“合并”条件有多个匹配项时使用该条件。发生这种情况是因为,对于某些 B.id 行,随后的 [B.startdate, B.enddate] 间隔实际上是重叠的(即,对于给定的 A.date,可能有多个 B.foo 值)。在这些情况下,B.tiecondition 列将允许我在可能的匹配项中做出选择。
我想'on'子句可能会被修改为类似
on (
(A.id = B.id and A.date between B.startdate and B.enddate)
or (A.id = B.id and (A.date between B.startdate and B.enddate) and B.tiecondition = 1)
)
但我不确定我是否会得到正确的结果,或者是否有更优雅的方法来做到这一点。
也许我可以改用left join,并添加几个条件检查结果中是否有多个匹配项,并只保留满足条件的行,但这看起来也有点麻烦。
【问题讨论】:
-
A.date is between B.startdate and B.enddate在语法上无效。您需要删除is关键字。 -
@Giuseppe 。 . .如果这就是
merge中的全部内容,update可能会更简单。 -
对,对不起。我更正了。