我有一个需要,我需要使用两个查询,彼此不同的一个条件。例
SELECT * FROM table WHERE attribute1 = 'Y'; SELECT * FROM table WHERE attribute1 IS NULL;
我需要将来自这两个查询的数据插入到一个表中,唯一的条件是来自第一个查询的数据应该首先进入,然后是第二个查询。显然,我可以先运行第一个查询,然后再运行第二个查询,然后再执行一次插入。我的问题是,有没有更好的方法来做到这一点?
zbsbpyhn1#
在我看来
SELECT * FROM your_table WHERE ( attribute1 = 'Y' OR attribute1 IS NULL);
一个(更糟糕的)替代方案是union(all)这两个选择:
union
all
SELECT * FROM your_table WHERE attribute1 = 'Y' UNION ALL SELECT * FROM your_table WHERE attribute1 IS NULL;
7kqas0il2#
如果您请求的行数占表的百分比很大,那么就不需要了,没有更好的方法了。如果您要求第一次插入发生在第二次插入之前,那么保证这一点的方法是按顺序执行每个插入,作为单独的SQL语句。两者的任何组合都可能导致混合结果。当然,你可以用ORDER BY强制排序,你可以对UNION ALL做出假设(但是在最近的版本中,使用并发联合PX,这不是一个安全的假设),但是这些方法都不如简单地使用两个语句。一种可能相当昂贵。然而,如果你正在查询一个 * 巨大的 * 表,并且每个查询只需要 * 小 * 百分比的行,那么排序的成本 * 可能 * 比两次表扫描便宜。在这种情况下,您可以合并查询并使用显式ORDER BY强制顺序:
ORDER BY
UNION ALL
SELECT * FROM your_table WHERE NVL(attribute1,'Y') = 'Y' ORDER BY DECODE(attribute1,'Y',1,2)
但是,除非这是实现当前性能目标所必需的,否则它就不太清楚,因此不是一种很好的编码方法。最有可能在你的情况下,使用两个语句是最好的从所有Angular 来看。
2条答案
按热度按时间zbsbpyhn1#
在我看来
一个(更糟糕的)替代方案是
union
(all
)这两个选择:7kqas0il2#
如果您请求的行数占表的百分比很大,那么就不需要了,没有更好的方法了。如果您要求第一次插入发生在第二次插入之前,那么保证这一点的方法是按顺序执行每个插入,作为单独的SQL语句。两者的任何组合都可能导致混合结果。当然,你可以用
ORDER BY
强制排序,你可以对UNION ALL
做出假设(但是在最近的版本中,使用并发联合PX,这不是一个安全的假设),但是这些方法都不如简单地使用两个语句。一种可能相当昂贵。然而,如果你正在查询一个 * 巨大的 * 表,并且每个查询只需要 * 小 * 百分比的行,那么排序的成本 * 可能 * 比两次表扫描便宜。在这种情况下,您可以合并查询并使用显式
ORDER BY
强制顺序:但是,除非这是实现当前性能目标所必需的,否则它就不太清楚,因此不是一种很好的编码方法。最有可能在你的情况下,使用两个语句是最好的从所有Angular 来看。