sql >> Database >  >> RDS >> Oracle

SQL-query om het aantal woorden in de tabel te krijgen

Ervan uitgaande dat uw tafel de naam temp heeft (waarschijnlijk niet - verander het in de juiste naam van je tafel)

Ik heb een subquery gebruikt om alle woorden in je tabel te vinden:

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

deze query splitst alle woorden van alle records. Ik heb het een alias gegeven van words .
Vervolgens voegde ik het toe aan uw tabel (in de query heet het temp) en telde ik het aantal voorkomens in elk record.

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

Je kunt ook toevoegen:

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

bijwerken :voor betere prestaties kunnen we de innerlijke subquery vervangen door de resultaten van een pijplijnfunctie:
maak eerst een schematype en een tabel ervan:

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

maak dan de functie aan:

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;

nu zou de vraag er als volgt uit moeten zien:

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. Hoe vermijdt u het opslaan van referenties om verbinding te maken met Oracle met JDBC?

  2. Hoe verwijder je een reeks records in één keer op MySQL?

  3. Een door de gebruiker gedefinieerde gegevenstype-alias maken in SQL Server met behulp van T-SQL

  4. maak een orakelweergave op basis van een vergelijking van gegevens tussen twee databasetabellen