Oracle SQL查询中的奇怪'UNION'行为

时间:2010-04-23 18:08:55

标签: sql oracle

这是我的疑问:

SELECT my_view.*
FROM my_view
WHERE my_view.trial in (select 2 as trial_id from dual union select 3 from dual union select 4 from dual)
and my_view.location like ('123-%')

当我执行此查询时,它返回的结果不符合my_view.location like ('123-%')条件。这就好像完全忽略了这个条件。我甚至可以将其更改为my_view.location IS NULL并返回相同的结果,尽管该字段不可为空。

我知道这个查询对于双重选择看起来很荒谬,但我用这种方式构造它来复制我在使用'WITH'子句时遇到的问题(该查询的结果是从双列内联中选择的视图是)。

我可以像这样修改查询并返回预期的结果:

SELECT my_view.*
FROM my_view
WHERE my_view.trial in (2, 3, 4)
and my_view.location like ('123-%')

不幸的是我不知道前面的试验值(在'WITH'子句中查询它们)所以我无法以这种方式构造我的查询。我做错了什么?

我会说my_view视图由3个其他视图组成,其结果为UNION ALL,每个视图都通过DB Link检索一些数据。并不是说我认为这应该重要,但如果确实如此。

3 个答案:

答案 0 :(得分:1)

如果你没有这条路线的运气,你可以尝试的一件事是用“EXISTS”或“NOT EXISTS”声明替换“IN”。

如果您可以使用连接完成所需的操作,那么由于性能的原因,这将是最佳选择。如果您有从视图中提取数据的视图,您通常可以通过单个查询来执行您想要的操作,从而使用子查询提供更好的性能。

答案 1 :(得分:1)

如果你这样做

EXPLAIN PLAN FOR 
SELECT my_view.*
FROM my_view
WHERE my_view.trial in (select 2 as trial_id from dual union select 3 from dual union select 4 from dual)
and my_view.location like ('123-%');
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

你应该看到位置谓词的位置是9或者不是)。我敢打赌它与数据库链接有关,如果所有表都是本地的,你将无法重现它。

优化分布式查询变得复杂。

答案 2 :(得分:0)

尝试更改UNION查询以使用UNION ALL,如:

SELECT my_view.* 
FROM my_view 
WHERE my_view.trial in (select 2 as trial_id from dual
                        UNION ALL
                        select 3 AS TRIAL_ID from dual
                        UNION ALL
                        select 4 AS TRIAL_ID from dual) 
and my_view.location like ('123-%') 

我还在3和4个案例中加入了“AS TRIAL_ID”。我同意这些都不重要,但我偶尔会遇到一些我认为无关紧要的事情。

祝你好运。