Avatar billede bhn.314 Nybegynder
10. maj 2001 - 11:41 Der er 5 kommentarer og
1 løsning

Kompliceret forespørgsel i oracle

Vi har et problem af følgende karakter:

Tabeller/relationer:
billede(id, titel)
emnebillede(id, emneordId)
emneord(emneordId, ord)

Et billede har tilknyttet nogle emneord (ses via emnebillede relationen). Disse emneord har hvert et emneordId. Emnebillede relationen fortæller altså hvilke emneord et billede har.

Rent logisk vil vi nu gerne have en SQL-sætning der ser sådan ud:

SELECT titel
FROM (select???)R1, billede, emnebillede WHERE JOIN ord like \'skov\' AND ord like \'jagt\' OR ord like \'hest\' AND NOT ord like \'hingst\'

men, men, men hvordan gøres det rent praktisk i Oracle.
Avatar billede holdam Nybegynder
10. maj 2001 - 11:46 #1
SELECT b.titel
  FROM billede    b,
      emnebillede eb,
      emneord    eo
WHERE eo.ord IN (\'skov\', \'jagt\', \'hest\') -- or whatever
  AND eb.id      =b.id
  AND eb.emneordID=eo.emneordID
/
Avatar billede bhn.314 Nybegynder
10. maj 2001 - 11:59 #2
Rigtig godt bud, bortset fra at de boolske operatorer er forskellige(ikke kun AND):

ord like \'skov\' AND ord like \'jagt\' OR ord like \'hest\' AND NOT ord like \'hingst\'

Avatar billede holdam Nybegynder
10. maj 2001 - 12:42 #3
Så er det nok fordi jeg ikke forstår, hvad I ønsker - for et ord kan vel ikke være \'skov\' og \'jagt\' samtidig?

Måske skal udtrykket se således ud:

(eo.ord LIKE \'skov%\' OR eo.ord LIKE \'jagt%\' OR eo.ord LIKE \'hest%\') AND (eo.ord NOT LIKE \'hingst%\')

hvor % er et wildcardtegn. Hvis ikke I har brug for wildcards i sammenligningen, kan I anvender lig med (=) i stedet for LIKE - men så har AND NOT delen vist ingen betydning.

Avatar billede bhn.314 Nybegynder
10. maj 2001 - 13:26 #4
Et billede er beskrevet ved flere emneord. Derfor kunne vi ønske at få de billeder der har skov OG jagt ELLER hest, men IKKE hingst, som emneord.

Emnebillede indeholder:

  BID      EID
--------- ---------
        1        2
        1        1
        1        7
        1        5
        1        4
        2        1
        2        4
        2        6
        3        1
        3        5

Billede indeholder:

  BID TITEL
------ ----------------------------------------
    1 Skovsø i Syd
    2 Råvildt på flugt
    3 Plankens flugt over plankeværket

Emneord indeholder:

  EID ORD
----- ------
    1 bue
    2 and
    3 ko
    4 svin
    5 hest
    6 jagt
    7 vildt
Avatar billede holdam Nybegynder
10. maj 2001 - 13:57 #5
Så er det nok snarere et select som dette, I har brug for:

SELECT b.titel
  FROM billede    b,
(
SELECT eb1.bid
  FROM emnebillede eb1,
      emnebillede eb2,
      emneord eo1,
      emneord eo2
WHERE eb1.bid=eb2.bid
  AND eb1.eid=eb1.eid
  AND eb2.eid=eb2.eid
  AND eo1.ord=\'skov\'
  AND eo2.ord=\'jagt\'
UNION
SELECT eb3.bid
  FROM emnebillede eb3,
      emneord eo3
WHERE eb3.eid=eo3.eid
  AND eo3.ord=\'hest\'
MINUS
SELECT eb4.bid
  FROM emnebillede eb4,
      emneord eo4
WHERE eb4.eid=eo4.eid
  AND eo4.ord=\'hingst\'
) udvalgte
WHERE b.bid=udvalgte.bid;
Avatar billede bhn.314 Nybegynder
10. maj 2001 - 14:02 #6
Du har nu løst flere dages kamp mod denne problemstilling. Tusind tak, det var helt fantastisk.

Hav en god dag.
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