这是我的疑问:
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检索一些数据。并不是说我认为这应该重要,但如果确实如此。
答案 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”。我同意这些都不重要,但我偶尔会遇到一些我认为无关紧要的事情。
祝你好运。