2012-03-05 4 views
2

У меня есть таблица, в которой есть схемы, как этотSQL запрос, чтобы получить количество слов в таблице

id name 

1 jack 
2 jack of eden 
3 eden of uk 
4 m of s 

Я хочу, чтобы выполнить запрос, который дает мне считать слова, как это

count word 
2 jack 
2 eden 
3 of 

это означает, что гнездо было здесь 2 раза, eden 2 раза и 3 раза.

Надеется, что вы получили на вопрос, старается тоже, но не получают правильный запрос или подход к нему

Thnx

+0

я должен автоматически показывать слова, которые имеют появления более 1 – 1Mayur

ответ

2

Предполагая, что ваша таблицу называется temp (вероятно, не - изменить его на нужное имя вашего таблица)

Я использовал подзапрос для нахождения всех слов в таблице:

select distinct regexp_substr(t.name, '[^ ]+',1,level) word , t.name, t.id 
    from temp t 
    connect by level <= regexp_count(t.name, ' ') + 1 

этот запрос разбивает все горе rds из всех записей. Я сгладил его words.
Затем я присоединился к ней со своей таблицей (в запросе она называется temp) и подсчитала количество вхождений в каждой записи.

select words.word, count(regexp_count(tt.name, words.word)) 
from(
select distinct regexp_substr(t.name, '[^ ]+',1,level) word , t.name, t.id 
from temp t 
connect by level <= regexp_count(t.name, ' ') + 1) words, temp tt 
where words.id= tt.id 
group by words.word 

Вы можете также добавить:

having count(regexp_count(tt.name, words.word)) > 1 

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

create or replace type t is object(word varchar2(100), pk number); 
/
create or replace type t_tab as table of t; 
/

затем создать функцию:

create or replace function split_string(del in varchar2) return t_tab 
    pipelined is 

    word varchar2(4000); 
    str_t varchar2(4000) ; 
    v_del_i number; 
    iid  number; 

    cursor c is 
    select * from temp; -- change to your table 

begin 

    for r in c loop 
    str_t := r.name; 
    iid := r.id; 

    while str_t is not null loop 

     v_del_i := instr(str_t, del, 1, 1); 

     if v_del_i = 0 then 
     word := str_t; 
     str_t := ''; 
     else 
     word := substr(str_t, 1, v_del_i - 1); 
     str_t := substr(str_t, v_del_i + 1); 
     end if; 

     pipe row(t(word, iid)); 

    end loop; 

    end loop; 

    return; 
end split_string; 

теперь запрос должен выглядеть так:

select words.word, count(regexp_count(tt.name, words.word)) 
from(
select word, pk as id from table(split_string(' '))) words, temp tt 
where words.id= tt.id 
group by words.word 
+1

нормально с Oracle 11g, но более старые версии не приходят с REGEXP_COUNT. В противном случае: 'CONNECT BY length (regexp_susbstr (name, '[^] +', 1, level))> = 1' – Benoit

+0

Что это за таблица temp? – 1Mayur

+0

Вот как я назвал вашу таблицу в своем тестовом примере :) –

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