sql - 在 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');
解决方案
合并的“问题”是它会做一件事或另一件事。如果连接条件成立,记录将更新为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 条件生效
推荐阅读
- scala - 使用返回 Future 的二元运算折叠序列
- java - PDF 保存在 Oracle DB 中:错误 - java.sql.SQLException:数据大小大于此类型的最大大小:71365
- node.js - Type Error: Cannot read property 'hasListCollectionsCommand' of null
- php - 在 laravel 选择查询中获取附加数据
- python - 是否有来自 mysql 的任何 python 代码允许我选择第一行观察结果?
- javascript - 在 React 中更新嵌套数组中的嵌套对象
- java - 休息端点异常处理
- python-2.7 - 将数据从一个串行端口多路复用/解复用到“虚拟”端口
- java - 使用 Stream 时使用 Object 而不是 Map.Entry
- javascript - 使用一些标准 ES6 过滤数组