/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
SQL spørgsmål
Fra : Frederik Sunne


Dato : 06-04-03 20:33

Hej!

Jeg har en SQL forespørgsel som ser sådan ud:

SELECT DISTINCT a.id_projekt FROM projekt a, person_ramme b, ramme c WHERE
b.initialer='FS' and b.ID_ramme = c.ID_ramme and c.ID_projekt = a.id_projekt
OR a.initialer = 'FS';

Alt det som kommer før OR udtrækker korrekt, men er der tilfælde hvor
udsagnet før OR evalueres til FALSE, mens det efter OR er TRUE, og derfor
skal udtrækkes, sker det ikke.
Jeg kan ikke huske præcedens reglerne for boolske operatorer, så jeg ved
ikke om det er fordi OR binder svagere end AND.

Jeg kan ikke se hvorfor, kan I?

Venlig hilsen,

Frederik Sunne



 
 
Jens Gyldenkærne Cla~ (06-04-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 06-04-03 21:33

Frederik Sunne skrev:

> SELECT DISTINCT a.id_projekt FROM projekt a, person_ramme b,
> ramme c WHERE b.initialer='FS' and b.ID_ramme = c.ID_ramme and
> c.ID_projekt = a.id_projekt OR a.initialer = 'FS';

> Jeg kan ikke huske præcedens reglerne for boolske operatorer,
> så jeg ved ikke om det er fordi OR binder svagere end AND.

Hvis du er i tvivl så brug paranteser:

SELECT DISTINCT a.id_projekt
FROM projekt a, person_ramme b, ramme c
WHERE
(
   b.initialer='FS'
   and b.ID_ramme = c.ID_ramme
   and c.ID_projekt = a.id_projekt    
   )
OR a.initialer = 'FS';


Det ville i mine øjne være lettere at overskue forespørgslen hvis
du brugte eksplicit join:

SELECT DISTINCT p.id_projekt
FROM projekt p LEFT OUTER JOIN ramme r
   ON p.id_project = c.ID_project
   LEFT OUTER JOIN person_ramme pr
   ON r.ID_ramme = pr.ID_ramme
WHERE pr.initialer='FS'
OR p.initialer = 'FS';

Der kan være tilfælde hvor en post fra person_ramme bliver
udelukket på grund af join-forbindelsen, uanset om den har
initialer = 'FS'. Understøtter databasen FULL OUTER JOIN kan man
slippe uden om det.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Nis Jorgensen (07-04-2003)
Kommentar
Fra : Nis Jorgensen


Dato : 07-04-03 10:54

On Sun, 06 Apr 2003 22:33:25 +0200, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>
>SELECT DISTINCT p.id_projekt
>FROM projekt p LEFT OUTER JOIN ramme r
>    ON p.id_project = c.ID_project
>    LEFT OUTER JOIN person_ramme pr
>    ON r.ID_ramme = pr.ID_ramme
>WHERE pr.initialer='FS'
>OR p.initialer = 'FS';
>
>Der kan være tilfælde hvor en post fra person_ramme bliver
>udelukket på grund af join-forbindelsen, uanset om den har
>initialer = 'FS'. Understøtter databasen FULL OUTER JOIN kan man
>slippe uden om det.

FULL OUTER JOIN løser ikke problemet. Det gør det til gengæld hvis vi
inkluderer initial-kriteriet i JOIN-kriteriet.

SELECT DISTINCT p.id_projekt
FROM (projekt p LEFT OUTER JOIN ramme r
   ON p.id_project = r.ID_project)
   LEFT OUTER JOIN person_ramme pr
   ON r.ID_ramme = pr.ID_ramme AND pr.initialer='FS'
WHERE pr.initialer='FS'
OR p.initialer = 'FS';

Det mest logiske (efter min mening) ville dog være at bruge en UNION:

SELECT p.id_projekt
FROM projekt p
WHERE p.initialer = 'FS'

UNION

SELECT pr.id_projekt
FROM ramme r INNER JOIN person_ramme pr
   ON r.ID_ramme = pr.ID_ramme
WHERE pr.initialer='FS';

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Jens Gyldenkærne Cla~ (07-04-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 07-04-03 10:58

Nis Jorgensen skrev:

> Det mest logiske (efter min mening) ville dog være at bruge en
> UNION:

Ja - det er noget mere elegant.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste