一段时间以来,当我需要通过 ID 一次选择多个实体而我无法预测需要选择多少个实体时,我一直在使用这样的查询:
select * from MY_ENTITY where ID in (select * table(?))`
参数是一个 SQL ARRAY
,它是我的实体 ID 的相关类型。
这有点难看,但查询运行速度比使用 in (?, ?, ?, ?, ....)
之类的东西要快得多。最重要的是,它不会使用几乎相同的查询使服务器端查询缓存膨胀,只是传递给 IN
子句的参数数量不同。
所以这很有效。
但是,在某些情况下,我想要相同但具有成对值的情况。从概念上讲,我想做类似的事情:
select * from MY_ENTITY where (TAG_NAME, TAG_VALUE) in (TABLE(?, ?))`
其中每个参数都是相同长度的 SQL ARRAY
。但当然,这不适用于 Oracle。
到目前为止,我发现使这项工作有效的唯一方法是相当可怕(尽管它似乎有效)
select *
from MY_ENTITY
where (TAG_NAME, TAG_VALUE) IN (
select TAG_NAME, TAG_VALUE
from
(select ROWNUM as IDX, column_value as TAG_NAME from TABLE(?)) A,
(select ROWNUM as IDX, column_value as TAG_VALUE from TABLE(?)) B
where
A.IDX = B.IDX
);
Oracle 有没有更简单的方法可以做到这一点?
答案 0 :(得分:0)
如果使用语句 EXISTS
或 NOT EXISTS
,查询速度会更快。
在这些语句中,您只需要在 WHERE
子句中指定连接表的条件。
select *
from MY_ENTITY my_ett
where EXISTS (
select A.TAG_NAME, B.TAG_VALUE
from
(select ROWNUM as IDX, column_value as TAG_NAME from TABLE(?)) A,
(select ROWNUM as IDX, column_value as TAG_VALUE from TABLE(?)) B
where
A.IDX = B.IDX AND A.TAG_NAME = my_ett.TAG_NAME AND B.TAG_VALUE = my_ett.TAG_VALUE
);