在 SQL 中合并不尊重 ON
Merge not respecting ON in SQL
我有一组 Merge 语句,我在 Advantage SQL 中 运行,但我发现有些语句不起作用。我知道为什么,但不确定我的脚本中哪里出错了。请参阅下面的脚本。在 ON 语句中,它说 optionaltype in ('O', 'C', 'U') 的部分是我认为出错的地方。在#tmpappoint table 中,没有 O、C 或 U 的可选类型,而是 L,但似乎我们并没有忽视这个声明,我们正在寻求通过 #tmpappoint 中的 optionalid,无论如何,尽管这是 L 的可选类型。不幸的是,L 的可选 ID 不是可以在另一个 table 中找到的官员代码,因此我得到了错误。
在这个声明中我可以做什么来忽略任何不是 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');
合并的 "problem" 是它要么做一件事,要么做另一件事。如果连接条件成立,记录将在 pcevactor
中更新。如果连接不成功,记录将插入 pcevactor
您似乎是在说您的 #tmpappoint
table 当前已满类型 'L',因此连接条件将不成立,将始终使用 INSERT。
如果您希望在 #tmpappoint
中 'L' 的情况下偶尔使用更新(即,如果 ev.evid = ap.evid and
ev.officer = ap.optionalid
可行),那么您必须将 'L' 也输入 IN:
optionaltype in ('L', 'O', 'C', 'U'))
如果 #tmpappoint
包含各种代码,而您现在只想执行 'L' 代码,请在源代码处优化 #tmpappoint table:
merge pcevactor ev
using (Select * from #tmpappoint where optionaltype = 'L') ap
on (... and
optionaltype in ('L', 'O', 'C', 'U'))
...
请记住,合并语句中 USING 之后的 table 或查询是驱动合并的数据集;只有 ap 中的那些行(无论是查询还是 table)将在 pcevactor
中搜索,并根据需要进行更新或插入。 ap
中未提及的行未被触及
通过上面的扩展:
如果 #tmpappoint
包含各种代码,而您现在不想做除 O、C、U 以外的任何事情,请在源代码处优化 #tmpappoint table(并删除不再需要的合并条件):
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 需要用作 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 条件生效
我有一组 Merge 语句,我在 Advantage SQL 中 运行,但我发现有些语句不起作用。我知道为什么,但不确定我的脚本中哪里出错了。请参阅下面的脚本。在 ON 语句中,它说 optionaltype in ('O', 'C', 'U') 的部分是我认为出错的地方。在#tmpappoint table 中,没有 O、C 或 U 的可选类型,而是 L,但似乎我们并没有忽视这个声明,我们正在寻求通过 #tmpappoint 中的 optionalid,无论如何,尽管这是 L 的可选类型。不幸的是,L 的可选 ID 不是可以在另一个 table 中找到的官员代码,因此我得到了错误。 在这个声明中我可以做什么来忽略任何不是 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');
合并的 "problem" 是它要么做一件事,要么做另一件事。如果连接条件成立,记录将在 pcevactor
中更新。如果连接不成功,记录将插入 pcevactor
您似乎是在说您的 #tmpappoint
table 当前已满类型 'L',因此连接条件将不成立,将始终使用 INSERT。
如果您希望在 #tmpappoint
中 'L' 的情况下偶尔使用更新(即,如果 ev.evid = ap.evid and
ev.officer = ap.optionalid
可行),那么您必须将 'L' 也输入 IN:
optionaltype in ('L', 'O', 'C', 'U'))
如果 #tmpappoint
包含各种代码,而您现在只想执行 'L' 代码,请在源代码处优化 #tmpappoint table:
merge pcevactor ev
using (Select * from #tmpappoint where optionaltype = 'L') ap
on (... and
optionaltype in ('L', 'O', 'C', 'U'))
...
请记住,合并语句中 USING 之后的 table 或查询是驱动合并的数据集;只有 ap 中的那些行(无论是查询还是 table)将在 pcevactor
中搜索,并根据需要进行更新或插入。 ap
中未提及的行未被触及
通过上面的扩展:
如果 #tmpappoint
包含各种代码,而您现在不想做除 O、C、U 以外的任何事情,请在源代码处优化 #tmpappoint table(并删除不再需要的合并条件):
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 需要用作 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 条件生效