2012-06-15 2 views
2

Мне нужно создать подзапрос, чтобы выбрать строки, имеющие соответствующие значения в столбце.Oracle Subquery

Пример

Select * 
from person 
where first_name in ('Java','SQL','Oracle'); 

Однако этот список внутри скобок может быть большим, Шифрование до 30000 значений. Я буду читать значения из файла и передам его внутри этой скобки. Однако я думал, что может быть ограничение количества значений, которое я могу предоставить в круглых скобках. Существует ли оптимальное решение для решения этого сценария без создания и загрузки новой таблицы с данными?

EDIT: Спасибо за ваши ответы. Является ли приведенный ниже запрос опцией для рассмотрения -

Select * 
from person 
where first_name like 'Java' 
    or first_name like 'SQL' 
    or first_name like 'Oracle'; 

Спасибо.

+0

Вы можете иметь только 1000 значений в списке IN. – cagcowboy

+4

30 000 значений, вероятно, не будут обрабатываться эффективно, если вообще. Вы бы лучше загрузили их в таблицу и позволили СУБД использовать ее оптимизатор в полной мере. Возможно, существует верхняя граница размера SQL, которую вы можете написать; 30 000 значений, скорее всего, подтолкнут этот предел. –

ответ

4

Я согласен с Джонатаном, учитывая, что 30000 значений - это не способ пойти сюда, и его решение - хороший способ. Но вот еще одна идея: у Oracle есть хорошая функция под названием «Внешние таблицы».

С помощью внешних таблиц вы можете обрабатывать файл так, как если бы это была таблица. Если ваш файл хорошо структурирован (например, CSV), вы можете легко использовать эту функцию.

Google «Oracle Внешних таблиц», и вы найдете много информации и примеров, но для начала прочитать this:

В принципе, вам нужен объект каталога сказать Oracle, где файл находится, то вы будете создавать внешнюю таблицу, возможно что-то вроде ниже:

create directory DIR_MYFILE as '/my_source_dir/'; 

create table EXT_MY_FILE 
    ( 
     some_id number(8), 
     some_value varchar2(100) 
    ) 
    organization external 
    (default directory DIR_MYFILE 
    access parameters 
    (records delimited by newline 
     fields terminated by ',' 
    ) 
    location ('my_file.csv') 
); 

Используя эту таблицу в запросе:

select * from person where first_name in (select some_value from EXT_MY_FILE); 

EDIT: См. Комментарий APC, у него есть хорошая точка.

+2

Имейте в виду, что внешний стол дает нам полный спектр синтаксиса SQL. «IN» на 30 000 рядах может быть не таким, как сказать, внутреннее соединение. Было бы целесообразно сравнивать различные запросы. – APC

1

Если вы можете обработать файл в PL/SQL, конвейерная функция может быть другой опцией.