gpt4 book ai didi

sql - 在 Oracle 中,如何对多个数组使用 IN 子句?

转载 作者:行者123 更新时间:2023-12-05 06:48:38 26 4
gpt4 key购买 nike

一段时间以来,当我需要通过 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 有更简单的方法吗?

最佳答案

如果使用EXISTSNOT 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
);

关于sql - 在 Oracle 中,如何对多个数组使用 IN 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66783075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com