2015-03-10 3 views
1

Я хочу, чтобы преобразовать следующие IN запроса в внутреннее соединение запроса:расщепление запятыми список в временную таблицу

select country, name, rank from table person_details 
    where country in ('india','USA','australia') 
    and name in ('tom', 'jill', 'jack') 
    and rank in ('first', 'third', 'fifith'); 

У меня есть два вопроса:

  1. эта таблица большой, так что будет изменение этот запрос IN во внутреннее соединение ускорит работу.

  2. Что будет лучшим способом разделить этот список, разделенный запятой, на столбец в некоторой временной таблице. Я вижу много примеров регулярных выражений, но они кажутся слишком сложными и большими.

Я использую Oracle 11g DB.

Таблица снимок:

Id name country rank 
1 tom india  first 
2 jill USA  second 
3 jack aus  first 
+0

Я не думаю, что здесь 'self join' будет работать быстрее, чем' IN', создать индекс на 'country' и' rank', который поможет ускорить работу. и в отношении списка, разделенного запятыми ... Я скажу: «У вас есть структура таблицы по крайней мере в« 1NF ». Если ваша таблица не находится в '1NF', вы можете столкнуться с серьезными проблемами производительности. –

+1

См. Примеры здесь https://lalitkumarb.wordpress.com/category/oracle-delimited-string-manipulation/ –

+0

@LalitKumarB Хороший ... !!! –

ответ

0

выберите страну, имя, звание из таблицы person_details

Запрос синтаксически некорректным. вам не нужно ключевое слово TABLE. Вобще:

select country, name, rank from person_details

Строго говоря, ваша таблица не нормализуется. Вы не должны хранить несколько значений в одном столбце. Рано или поздно вы увидите проблемы с производительностью. Никогда не поздно перепроектировать ваши таблицы и сохранить значения в отдельных столбцах.

Сказав это, существует много способов разделить строку с разделителями-запятыми на строки. вот один простой способ использования REGEXP_SUBSTR и Instr в CONNECT BY пункта:

SQL> WITH DATA AS(
    2 select q'['india','USA','australia']' countries, 
    3 q'['tom', 'jill', 'jack']' names, 
    4 q'['first', 'third', 'fifth']' ranks 
    5 from dual 
    6 ) 
    7 SELECT regexp_substr(translate(countries,'''',' '), '[^,]+', 1, LEVEL) countries, 
    8 trim(regexp_substr(translate(names,'''',' '), '[^,]+', 1, LEVEL)) names, 
    9 trim(regexp_substr(translate(ranks,'''',' '), '[^,]+', 1, LEVEL)) ranks 
10 FROM DATA 
11 CONNECT BY instr(countries, ',', 1, LEVEL - 1) > 0 
12/

COUNTRIES     NAMES     RANKS 
------------------------- --------------------- ------------------------- 
india     tom     first 
USA      jill     third 
australia    jack     fifth 

SQL> 

я показал другие пути в моей статье ORACLE DELIMITED STRING MANIPULATION.

+0

hi lalit, столбцы не имеют нескольких значений. CSV - это критерии выбора фильтра пользователем. если это то, что вы имели в виду. – user2696466

+0

да, спасибо. но мы должны сделать всю эту операцию для преобразования CSV в столбец temp table. Если да, то можете ли вы просто дать краткое описание того, как работает этот запрос. Я не мог понять этого. У MSSQL были более простые способы сделать это. – user2696466

+0

Это простой метод. Все, что я делаю, это использование 'regexp_substr', извлекающее каждую подстроку между запятыми, а затем предложение connect by преобразует его в строки. УРОВЕНЬ указывает приращение строки. Есть 3 значения, поэтому в этом случае уровень будет равен 3. Пожалуйста, отметьте его, чтобы он помог другим найти это как правильное решение. –

 Смежные вопросы

  • Нет связанных вопросов^_^