oracle 有比下面更好的方法来插入到表中吗?

rwqw0loc  于 2023-06-29  发布在  Oracle
关注(0)|答案(2)|浏览(99)

我有一个需要,我需要使用两个查询,彼此不同的一个条件。例

SELECT * 
  FROM table
 WHERE attribute1 = 'Y';

SELECT * 
  FROM table
 WHERE attribute1 IS NULL;

我需要将来自这两个查询的数据插入到一个表中,唯一的条件是来自第一个查询的数据应该首先进入,然后是第二个查询。显然,我可以先运行第一个查询,然后再运行第二个查询,然后再执行一次插入。我的问题是,有没有更好的方法来做到这一点?

zbsbpyhn

zbsbpyhn1#

在我看来

SELECT *
  FROM your_table
 WHERE (   attribute1 = 'Y'
        OR attribute1 IS NULL);

一个(更糟糕的)替代方案是unionall)这两个选择:

SELECT *
  FROM your_table
 WHERE attribute1 = 'Y'
UNION ALL
SELECT *
  FROM your_table
 WHERE attribute1 IS NULL;
7kqas0il

7kqas0il2#

如果您请求的行数占表的百分比很大,那么就不需要了,没有更好的方法了。如果您要求第一次插入发生在第二次插入之前,那么保证这一点的方法是按顺序执行每个插入,作为单独的SQL语句。两者的任何组合都可能导致混合结果。当然,你可以用ORDER BY强制排序,你可以对UNION ALL做出假设(但是在最近的版本中,使用并发联合PX,这不是一个安全的假设),但是这些方法都不如简单地使用两个语句。一种可能相当昂贵。
然而,如果你正在查询一个 * 巨大的 * 表,并且每个查询只需要 * 小 * 百分比的行,那么排序的成本 * 可能 * 比两次表扫描便宜。在这种情况下,您可以合并查询并使用显式ORDER BY强制顺序:

SELECT *
  FROM your_table
 WHERE NVL(attribute1,'Y') = 'Y'
ORDER BY DECODE(attribute1,'Y',1,2)

但是,除非这是实现当前性能目标所必需的,否则它就不太清楚,因此不是一种很好的编码方法。最有可能在你的情况下,使用两个语句是最好的从所有Angular 来看。

相关问题