Avatar billede steffenjorgensen Nybegynder
07. marts 2006 - 21:13 Der er 12 kommentarer

Select - Output betinget af ens poster i 2 andre tabeller

Hej.

Jeg har problemer med at få lavet en select, der giver mig data betinget af om posterne i anden tabel også findes i trede tabel.
Mine tabeller ser således ud:

t1
-------
ID
T3id
Data11


t2
-------
T1id
A


t3
-------
ID
Data31


t4
-------
T3id
A


Og relationerne således:
t2 -n---1- t1
t1 -n---1- t3
t3 -1---n- t4


Jeg skal bruge dataene fra t1. Men hvis der er findes en eller flere poster i t2 som relaterer til en post i t1, skal disse poster også findes i t4 (t2.a = t4.a), ellers skal posten fra t1 IKKE med i mit resultat.
Betingelsen går IKKE den anden vej, dvs. hvis der er findes poster i t4 som relaterer til posten i t1 (via t3), hvor den tilsvarende post ikke findes i t2 skal t1-posten stadig med i mit resultat.
Hvis der IKKE findes poster i t2 som relaterere til en post i t1, skal denne også med i resultatet.

Håber I forstår, hvad jeg mener (det blev vist ligeså svært at beskrive som at lave SQL-sætningen ;-)).

Nogen der har et par forslag til hvordan det kan kringles?
Avatar billede arne_v Ekspert
07. marts 2006 - 21:23 #1
SELECT * FROM t1
WHERE NOT EXIST (SELECT * FROM t2 WHERE t2.t1id=t1.id)
      OR EXIST (SELECT * FROM t1,t3,t4 WHERE t4.t3id=t3.id AND t3.t1id=t1.id)

burde kunne loese det (men er naeppe hurtigt)
Avatar billede steffenjorgensen Nybegynder
07. marts 2006 - 21:39 #2
Hej Arne.

Tak for det hurtige svar, men det virker desværre ikke, jeg får følgende fejl:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM t2 WHERE t2.t1id=t1.id)
OR EXIST (SELECT * FROM t1,t3,t4 WHERE t4' at line 2

Jeg bruger MySQL 5, så nested SQL skulle ikke være problemet...

Når jeg kigger på SQL-sætningen, synes jeg heller ikke at jeg kan se at der bliver tjekket for at posterne i t2 også findes i t4?
Avatar billede arne_v Ekspert
07. marts 2006 - 21:40 #3
EXISTS med S
Avatar billede arne_v Ekspert
07. marts 2006 - 21:42 #4
er det:

SELECT * FROM t1
WHERE NOT EXISTS (SELECT * FROM t2 WHERE t2.t1id=t1.id)
      OR EXISTS (SELECT * FROM t2,t1,t3,t4 WHERE t2.a=t4.a AND t4.t3id=t3.id AND t3.t1id=t1.id)

du mener ?
Avatar billede steffenjorgensen Nybegynder
07. marts 2006 - 21:58 #5
Nu virker SQL-sætningen, det er bare ikke det ønskede resultat.
I resultatet får jeg poster, hvor der ikke er nogen relationer i t2 , og der er OK.

Men jeg får desværre også poster med, bare een af posterne i t2 også findes i t4.

F.eks. har jeg 1 post i t1, som har to relationer fra t2 (en hvor a=100 og en hvor a=110). Til posten i t1 relaterer 3 poster i t4, men i disse 3 poster er a=110, a=120 og a=130). Dvs. at der i t4 mangler en relation hvor a=100, derfor ønsker jeg ikke denne post fra t1 med i resultatet...
Kan det fixes?
Avatar billede arne_v Ekspert
07. marts 2006 - 22:20 #6
saa skal der nok en ekstra betingelse paa den sidste subquery

t2.t1id=t1.id

maaske
Avatar billede steffenjorgensen Nybegynder
07. marts 2006 - 22:38 #7
Desværre... Det giver samme resultat...
Det kan være at jeg bliver nød til at ty til "Stored procedures"?
Avatar billede arne_v Ekspert
07. marts 2006 - 22:44 #8
det vil ikke lose dit problem

det her er et rent SQL problem

men proev og leg med de subqueries alene og faa dem til at returenere det rigtige
Avatar billede steffenjorgensen Nybegynder
07. marts 2006 - 22:47 #9
ok... Jeg prøver at lege lidt med de kære subqueries...
Avatar billede barklund Nybegynder
08. marts 2006 - 11:28 #10
du kan lave en count på antallet kombineret der skal matche antallet fra t2 som:

SELECT * FROM t1
WHERE NOT EXISTS (SELECT * FROM t2 WHERE t2.t1id=t1.id)
      OR
        (SELECT COUNT(1) FROM t2,t3,t4 WHERE t2.a=t4.a AND t4.t3id=t3.id AND t3.t1id=t1.id) =
        (SELECT COUNT(1) FROM t2 WHERE t2.t1id=t1.id)

Tror jeg måske? :)

Det undrede mig også, at t1 blev brugt i udvælgelse i indre query - så relaterer den jo overhovedet ikke til den udenom?

--
Morten Barklund
Avatar billede steffenjorgensen Nybegynder
10. marts 2006 - 12:34 #11
Yes sir!

Så er vi kørende....

Lægger du lige et svar, så du kan få point?
Avatar billede arne_v Ekspert
06. oktober 2006 - 03:17 #12
barklund ?
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