[SQL] SELECT probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
Stel ik heb 3 tabellen:

Tabel-1:

ID
Kolom1
Kolom2
Kolom3

Tabel-2:

Tabel1_ID
Kolom2
Kolom3

Tabel-3:

Tabel1_ID
Kolom2
Kolom3

Nu wil ik hier een Select op loslaten met als resultaat alle rijen van tabel-1 waar het ID in tabel-2 Tabel1_ID voorkomt OF in tabel-3 Tabel_ID

Ik dacht zelf aan:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
 Tabel-1.Kolom1,
 Tabel-1.Kolom2,
 Tabel-1.Kolom3
FROM
  Tabel-1,
  Tabel-2,
  Tabel-3
WHERE
  Tabel-2.Tabel1_ID = Tabel-1.ID
OR
  Tabel-3.Tabel1_ID = Tabel-1.ID


Dit werkt op zich wel, al krijg ik duplicate waardes. Ook als ik een Distinct toevoeg aan de Select

Hoe los ik dit op?

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 10:55

MueR

Admin Tweakers Discord

is niet lief

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55

skabouter

Skabouter

kijk eens naar de JOIN functie; een goede uitleg vind je hier

edit
Je query zal dan iets als volgt worden:

SQL:
1
2
3
4
5
6
7
8
SELECT
 Tabel-1.Kolom1,
 Tabel-1.Kolom2,
 Tabel-1.Kolom3
FROM
  Tabel-1
LEFT JOIN Tabel-2 ON (Tabel-2.Tabel1_ID = Tabel-1.ID)
LEFT JOIN Tabel-3 ON (Tabel-3.Tabel1_ID = Tabel-1.ID)


Eventueel kun je dit nog uitbreiden met een GROUP BY, maar ik neem aan dat je daar verder wel zelf uit kan komen.

[ Voor 73% gewijzigd door skabouter op 16-04-2012 16:19 . Reden: Links bijgewerkt / code toegevoegd ]

[ Dislect ]


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Een mogelijk query is:
SQL:
1
2
3
4
SELECT Tabel-1.ID, Tabel-1Kolom1, etc
FROM Tabel-1
WHERE EXISTS (SELECT 1 FROM Tabel-2 WHERE Tabel-2.Tabel1_ID = Tabel-1.ID)
OR EXISTS (SELECT 1 FROM Tabel-3 WHERE Tabel-2.Tabel1_ID = Tabel-1.ID)


De query van skabouter is verkeerd: hiermee krijg je alleen de records die in beide tabellen voor komen alle records of ze wel of niet in tabel-2 en tabel-3 voorkomen.
Je kan het wel voor elkaar krijgen met LEFT JOIN en een WHERE condition die controleert of de kolommen uit de join tabellen niet null zijn:
SQL:
1
2
3
4
5
SELECT DISTINCT Tabel-1.ID, Tabel-1.Kolom1, etc
FROM Tabel-1
LEFT JOIN Tabel-2 ON Tabel-2.Tabel1_ID = Tabel-1.ID
LEFT JOIN Tabel-3 ON Tabel-3.Tabel1_ID = Tabel-1.ID
WHERE NOT (Tabel-2.Tabel1_ID IS NULL AND Tabel-3.Tabel1_ID IS NULL)

Nadeel hiervan is wel dat je een DISTINCT moet doen om van dubbelen af te komen (dat probleem heb je niet bij mijn eerste query)

[ Voor 12% gewijzigd door Remus op 16-04-2012 16:24 . Reden: nav edit van skabouter bijgewerkt (die INNER JOIN verving door een LEFT JOIN in zijn antwoord) ]


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
Met die JOIN was ik er al achter gekomen dat dat niet werkte. EXISTS had ik al geprobeerd, maar daar had ik een blijkbaar een syntaxfout mee gemaakt waardoor ik dacht dat dat niet ging. Zoals het voorbeeld van Remus werkt het wel.

Bedankt.

[ Voor 11% gewijzigd door Swerfer op 16-04-2012 16:32 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Swerfer schreef op maandag 16 april 2012 @ 16:31:
Met die JOIN was ik er al achter gekomen dat dat niet werkte. EXISTS had ik al geprobeerd, maar daar had ik een blijkbaar een syntaxfout mee gemaakt waardoor ik dacht dat dat niet ging. Zoals het voorbeeld van Remus werkt het wel.

Bedankt.
Als je join op de juiste manier gebruikt dan zal het ook werken hoor.
Pagina: 1