我有一个select查询,我正在进行内连接,在AND
子句中我正在检查这个
AND UPPER (b.a1||b.a2) IN
(
select a.a1||a.a2
from a
where a.a3 =
(
select UPPER(decode('609',null,c.c1,'609'))
from dual
)
)
但是因为||
操作员需要超过2分钟。我们可以有任何其他解决方案吗?
答案 0 :(得分:4)
如何使用EXISTS
子句?
AND EXISTS (
SELECT
1
FROM
a
WHERE
a.a3 = (SELECT UPPER(DECODE('609',c.c1,'609')) FROM dual) -- this condition is pretty odd
AND a.a1 = UPPER(b.a1)
AND a.a2 = UPPER(b.a2)
)
在UPPER(b.a1)和UPPER(b.a2)上添加基于函数的索引也可能有所帮助。
说到那个奇怪的情况:(SELECT UPPER(DECODE('609',c.c1,'609')) FROM dual)
:
为什么要在那里执行SELECT
?
您检查的是 - 如果'609'
等于c.c1
('609'
),那么a.a3
必须等于'609'
,在任何其他情况下,SELECT
{ {1}}返回NULL
,因此不会返回表a
中的值。因此,您只需将整个条件更改为a.a3 = '609'
。
答案 1 :(得分:2)
尝试使用JOIN
SELECT *
FROM b
JOIN ( select UPPER(a.a1), UPPER(a.a2)
from a
where a.a3 = (select UPPER(decode('609',c.c1,'609')) from dual)
) a
ON UPPER(b.b1) = a.a1
AND UPPER(b.b2) = a.a2
但问题是当你执行UPPER(b.b1)
或b1||b2
时,你不能再使用索引了。
您可能需要function index
答案 2 :(得分:2)
您不需要连接。实际上:连接值是一个等待发生的错误:考虑表foob
中的值ar
和b
以及foo
和bar
中的值a
和select from dual
1}} - 串联将它们视为相同的元组,尽管它们不是。
您还不需要AND (UPPER (b.a1), upper(b.a2)) IN
(
select a.a1. a.a2
from a
where a.a3 = UPPER(decode('609',null,c.c1,'609'))
)
作为常量:
b(a1,a2)
b (UPPER (b.a1), upper(b.a2))
上的索引不能用于此,但您可以在var err = {"success":"0","result":{},"errorMessage":"user Invalid"},
holder = document.getElementById('errorholder');
if(err.success == '0'){
holder.innerHTML = err.errorMessage;
} else {
// redirect using window.location
}
上创建一个可以使用的索引。