Avatar billede gvp Nybegynder
09. november 2009 - 15:34 Der er 1 løsning

søgning vha. CONTAINS() med dynamiske keywords

hej håber der er en der kan hjælpe mig.

jeg har 3 tabeller.
tabellerne ser ud på flg måde:

tabel_1:
id (NUMBER 8,0)
name (VARCHAR 40)
comment (CLOB)

tabel_2:
id (NUMBER 8,0)
name (VARCHAR 40)
comment (CLOB)

tabel_1_keywords:
id (NUMBER 8,0)
tabel_1_id (NUMBER 8,0)
keyword (VARCHAR 20)

meningen er at jeg skal søge i tabel 2 efter de keywords der passer til en given række i tabel 1.

dette eksempel virker:

SELECT SCORE(1) score, t2.id, t2.name
FROM  table_2 t2
WHERE  CONTAINS(t2.name, 'ord1 AND ord2', 1) > 0
ORDER BY SCORE(1) DESC;


jeg kan bare ikke få den næste query til at virke. Jeg kan godt forstå hvorfor den ikke virker, bare ikke hvordan jeg skal redde den:

SELECT SCORE(1) score, t1.name, t2.id, t2.name
FROM  table_2 t2, table_1 t1, tabel_1_keywords kw
WHERE  CONTAINS(t2.name, kw.keyword, 1) > 0
AND kw.tabel_1_id = t1.id
AND t1.id = :id
ORDER BY SCORE(1) DESC;

tak på forhånd.
Avatar billede gvp Nybegynder
09. november 2009 - 16:20 #1
fik det løst, men kan ikke overskue at skrive det om til test tabeller, så her er den min query i en list anden form:

SELECT SCORE(1) score, cp.name, cp.chainid
FROM competitorproduct cp
WHERE CONTAINS(
  cp.name, (SELECT IMPLODE(CURSOR(
    SELECT kw.keyword
    FROM masterproduct mp, masterproduct_keyword kw
    WHERE (
      kw.chainid = :chainid
      OR kw.chainid IS NULL
    )
    AND kw.sku = :sku
    GROUP BY kw.keyword), ' ACCUM '
  )
  FROM DUAL), 1
) > 0
GROUP BY SCORE(1), cp.name, cp.chainid
ORDER BY SCORE(1) DESC;


der skal bruges in funktion til dette:

CREATE OR REPLACE FUNCTION IMPLODE
(
  p_cursor SYS_REFCURSOR,
  p_delimiter VARCHAR2 := ','
)
RETURN
  VARCHAR2
AS
  v_token  VARCHAR2(32767);
  v_output VARCHAR2(32767);
BEGIN
  LOOP
            FETCH p_cursor INTO v_token;
    EXIT WHEN p_cursor%NOTFOUND;
    IF v_output IS NOT NULL THEN
      v_output := v_output || p_delimiter;
    END IF;
    v_output := v_output || v_token;
  END LOOP;
  RETURN v_output;
END IMPLODE;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester