我需要替换用 union all 编写的代码,因为它在执行期间挂起
I need to replace code written with union all as it is getting hung during execute
我有一个具有主键 coa_key 的 table,它有 7 个标记为 extract_code1、extract_code2...
的字段
现在编写的代码 select 带有 code1 的密钥,如果 table2 中不存在,则将其插入 table2。
INSERT INTO ef_extract_codes_t
SELECT coa_key, extract_code1
FROM ef_load_it l
WHERE extract_code1 IS NOT NULL AND
NOT EXISTS (SELECT e.coa_key||e.extract_code
FROM ef_extract_codes_t e
WHERE e.coa_key||e.extract_code = l.coa_key||extract_code1)
union all同上,除了code2,然后重复直到检查完所有7个code。
谁能帮我写一个更好的方法,以免挂起?
这只是一个猜测,因为您还没有发布 "hung" 执行的配置文件,但听起来您可以使用 MERGE
命令。
但是如果你的语句在功能上是正确的并且你的索引是足够的,你可能不必去重写的极端。由于大多数人可能 不会 使用您提供的表达式 e.coa_key||e.extract_code
创建索引,我建议替换
e.coa_key||e.extract_code = l.coa_key||extract_code1
有了这个:
e.coa_key = l.coa_key and e.extract_code = l.extract_code1
我相信如果 coa_key
和 extract_code
不能为空,这将起作用。如果它们可以为空,那么您需要决定如何处理这种情况。
我有一个具有主键 coa_key 的 table,它有 7 个标记为 extract_code1、extract_code2...
的字段现在编写的代码 select 带有 code1 的密钥,如果 table2 中不存在,则将其插入 table2。
INSERT INTO ef_extract_codes_t
SELECT coa_key, extract_code1
FROM ef_load_it l
WHERE extract_code1 IS NOT NULL AND
NOT EXISTS (SELECT e.coa_key||e.extract_code
FROM ef_extract_codes_t e
WHERE e.coa_key||e.extract_code = l.coa_key||extract_code1)
union all同上,除了code2,然后重复直到检查完所有7个code。
谁能帮我写一个更好的方法,以免挂起?
这只是一个猜测,因为您还没有发布 "hung" 执行的配置文件,但听起来您可以使用 MERGE
命令。
但是如果你的语句在功能上是正确的并且你的索引是足够的,你可能不必去重写的极端。由于大多数人可能 不会 使用您提供的表达式 e.coa_key||e.extract_code
创建索引,我建议替换
e.coa_key||e.extract_code = l.coa_key||extract_code1
有了这个:
e.coa_key = l.coa_key and e.extract_code = l.extract_code1
我相信如果 coa_key
和 extract_code
不能为空,这将起作用。如果它们可以为空,那么您需要决定如何处理这种情况。