首页 > 解决方案 > 在 SQL 中合并不尊重 ON

问题描述

我有一组在 Advantage SQL 中运行的 Merge 语句,但我发现有些语句不起作用。我知道为什么,但不确定在我的脚本中哪里出错了。请参阅下面的脚本。在 ON 语句中,它在 ('O', 'C', 'U') 中说 optionaltype 的部分是我认为出错的地方。在#tmpappoint 表中,没有 O、C 或 U 的可选类型,而是 L,但似乎我们并没有忽略此声明,并且我们希望通过 #tmpappoint 的 optionalid 无论如何,尽管这是一个L 的可选类型。不幸的是,L 的可选ID 不是可以在另一个表中找到的官员代码,因此我得到了错误。我能在这个声明中做些什么来忽略任何不是 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');   

标签: sqladvantage-database-serversql-merge

解决方案


合并的“问题”是它会做一件事或另一件事。如果连接条件成立,记录将更新为pcevactor. 如果连接不成功,则将记录插入pcevactor

您似乎在说您的#tmpappoint表当前充满了“L”类型,因此连接条件将无法解决,并且将始终使用 INSERT。

如果您希望在 'L' 的情况下偶尔使用 UPDATE(即如果ev.evid = ap.evid and ev.officer = ap.optionalid成功),#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 之后的表或查询是驱动合并的数据集;只有在 ap 中的那些行(无论是查询还是表)将被搜索pcevactor并根据需要进行更新或插入。中未提及的行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”表示需要用作 ID 的是官员的徽章编号而不是他们的员工编号时,您可以在尝试合并之前通过查询的方式操作数据:

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 条件生效


推荐阅读