合并不遵守SQL中的ON

时间:2019-01-17 10:00:53

标签: sql advantage-database-server sql-merge

我在Advantage SQL中运行了一组Merge语句,但是发现其中一些语句不起作用。我知道为什么,但是不确定在脚本中哪里出错了。请参见下面的脚本。我相信,在ON语句中,在('O','C','U')中表示optionaltype的部分是出错的地方。在#tmpappoint表中,没有O,C或U的可选类型,而是L,但是似乎我们并没有忽略此语句,尽管这是一个不幸的是,L的optionalid并不是可以在另一个表中找到的官码,因此我得到了错误。 在此声明中我该怎么做,以至于我无法理解不是O,C或U的任何内容?

merge pcevactor ev
using #tmpappoint ap
on (ev.evid = ap.evid and
ev.officer = ap.optionalid and
optionaltype in ('O', 'C', 'U'))
when matched then
update set
roles=trim(replace (roles,'C',''))+'C'
when not matched then
insert
(
evid,
officer, 
readstatus,
flagstatus,
roles)
values
(ap.evid,
ap.optionalid,
'U',
'-',
'C');   

1 个答案:

答案 0 :(得分:0)

合并带来的“问题”是它将完成一件事或另一件事。如果连接条件成立,则记录将在pcevactor中更新。如果连接无法解决,则将记录插入pcevactor

您似乎在说#tmpappoint表当前已填满'L'类型,因此联接条件将无法解决,并且将始终使用INSERT。

如果您希望ev.evid = ap.evid and ev.officer = ap.optionalid中的'L'偶尔使用UPDATE(即如果#tmpappoint可行),则必须将'L'放入IN以及:

optionaltype in ('L', 'O', 'C', 'U'))

如果#tmpappoint包含各种代码,并且您现在只想执行'L'代码,请在源代码处优化#tmpappoint表:

merge pcevactor ev
using (Select * from #tmpappoint where optionaltype = 'L') ap
on (... and
optionaltype in ('L', 'O', 'C', 'U'))
...

请记住,合并语句中USING之后的表或查询是驱动合并的数据集;仅在pcevactor中搜索ap中的那些行(无论是查询还是表),并根据需要进行更新或插入。未触及ap中未提及的行


通过以上内容的扩展:

如果#tmpappoint包含各种代码,并且您现在不想执行除O,C,U之外的任何其他操作,请在源代码处优化#tmpappoint表(并按原样删除合并条件)不再需要):

merge pcevactor ev
using (Select * from #tmpappoint where optionaltype in ('O', 'C', 'U')) ap
on (ev.evid = ap.evid and
    ev.officer = ap.optionalid
)
when matched then

如果#tmppappoint中的数据存在某种缺陷,例如,当可选类型'L'表示需要作为证人的证件的badge_number而不是其employee_number时,您可以通过以下方式处理数据尝试合并查询之前:

MERGE ...
USING ( 
  SELECT 
    ...,
    --let's change what we put in optionalid depending on the code 
    CASE
      WHEN code = 'L' THEN badges.badge_number 
      ELSE t.employee_number
    END as optionalid,
    ...
  FROM
    #tmpappoint t 
    JOIN 
    badges ON badges.officer_code = t.officer_code
  ...

在这种情况下,如果它是L,则我们将他们的徽章编号作为ID,否则我们将输入Officer_code。.我们正在预处理数据以使合并的ON条件生效