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
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