Avatar billede hkb-x Nybegynder
25. maj 2009 - 15:38 Der er 6 kommentarer

finde de manglende relationer

Jeg har en tabel med felterne a og b. Ideen er at a-værdierne er linket sammen af optil flere b-værdier.

Jeg står i et problem hvor jeg for en 2 givne a-værdier, a1 og a2, gerne vil finde de b-værdier der kun tilhører a1 eller a2. Altså de b-værdier der tilhører hver af de 2 a-værdier men ikke linker dem sammen.

Hvordan kan det gøres?
Avatar billede arne_v Ekspert
25. maj 2009 - 15:52 #1
Jeg tror at du leder efter en self join.

SELECT *
FROM t t1,t t2
WHERE t1.b=t2.b AND t1.a=177 AND t2.a=179
Avatar billede hkb-x Nybegynder
25. maj 2009 - 16:00 #2
Det bruger jeg også men jeg leder efter en metode til at finde alle b-værdier der ikke linker a-værdier sammen i par.

Indtil videre er jeg nået frem til:

SELECT DISTINCT t1.a, t2.b
  FROM T AS t1, T AS t2
WHERE t1.a != t2.a
  AND t1.b != t2.b
  AND t1.b IN (SELECT t3.b FROM T AS t3 WHERE t3.a = t2.a)
  AND t2. NOT IN (SELECT t4.b FROM T AS t4 WHERE t4.a = t1.a);

Men den er som du kan se ikke specielt effektiv.
Avatar billede hkb-x Nybegynder
25. maj 2009 - 16:02 #3
Det jeg ønsker er alle b-værdierne der IKKE linker a-værdier sammen men hvor a-værdierne er linket sammen af nogle b-værdier. Så to a-værdier der er linket sammen af nogle b-værdier der vil jeg gerne finde resten af b-værdierne der ikke linker dem sammen.
Avatar billede arne_v Ekspert
25. maj 2009 - 16:09 #4
Jeg er stadig ikke sikker på at jeg forstå hvad "ikke linke sammen" betyder.

Måske:

SELECT *
FROM t
WHERE b NOT IN(
SELECT t1.b
FROM t t1,t t2
WHERE t1.b=t2.b AND t1.a=177 AND t2.a=179
)
Avatar billede hkb-x Nybegynder
25. maj 2009 - 16:12 #5
Forespørgslen kan jo barberes ned til:

SELECT DISTINCT t1.a, t2.b
  FROM T AS t1, T AS t2
WHERE t1.b IN (SELECT t3.b FROM T AS t3 WHERE t3.a = t2.a)
  AND t2. NOT IN (SELECT t4.b FROM T AS t4 WHERE t4.a = t1.a);

Så spørgsmålet er hvordan man optimerer denne forespørgsel mest muligt.
Avatar billede hkb-x Nybegynder
25. maj 2009 - 16:16 #6
FORKLKARING

Her er noget testdata:
+--------+------+
| a      | b    |
+--------+------+
|      1 |    1 |
|      1 |    2 |
|      1 |    3 |
|      2 |    1 |
|      2 |    3 |
|      3 |    4 |
+--------+------+

I dette tilfælde skal forespørgslen finde sættet 2, 2 da den eneste b-værdi der ikke linker a=2 til a=1 er b=2. Altså a=2 mangler b=2 før de passer sammen.

Meningen er at a1 og a2 skal have nøjagtigt de samme b-værdier hvis de bare har en b-værdi til fælles.

Det er lidt lakrids men det er jo også derfor jeg poster det her inde.
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

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



IT-JOB