Toon posts:

[SQL] Verschil tussen twee resultsets

Pagina: 1
Acties:
  • 158 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Misschien een hele simpele vraag. Echter mijn kennis, google, wc3 en de search hier konden binnen een uur geen antwoord vinden.

Ik heb query a en die levert velden a1 a2 en a3 op.

Ik heb query b en die levert velden b1,b2 en b3 op.

Query a en b zijn vrijwel identiek en nu wil ik het verschil hebben in de outputsets van query a en query b. Dus eigenlijk een omgekeerde join.

Dus ik wil datgene wat in b zit en niet in a.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

SQL:
1
Select * FROM tabelB WHERE ID Not IN (Select ID FROM TabelA)

:?

[ Voor 3% gewijzigd door gorgi_19 op 30-06-2004 09:31 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Wil je het verschil in records?

code:
1
2
3
4
SELECT * FROM B
LEFT OUTER JOIN A
ON B.EenSleutel = A.EenSleutel
WHERE A.EenVeld IS NULL


Als dit niet is wat je bedoeld kun je dan misschien wat voorbeelddata geven, met de gewenste output?

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
Thanks, maar het gaat om de combinatie van de drie elementen. Als er 1 element verschilt dan wil ik de hele rij wel hebben. Dit kan dus niet met een sleutel volgens mij.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Volgens mij kun je dan beter een union gebruiken

code:
1
2
3
SELECT * FROM A
UNION 
SELECT * FROM B


Dit geeft alleen unieke rijen terug, dubbele records worden er automatisch uitgefilterd.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Kan je dan niet beter MINUS oid pakken ?
Ik weet wel niet of alle DB's dit ondersteunen, maar ik geloof dat Oracle wel zoiets had.

MINUS gaat enkel de rows pakken uit de eerste query die niet voorkomen in de 2de resultset:
code:
1
2
3
select veld1, veld2, veld3 FROM a
MINUS
select blaat1, blaat2, blaat3 FROM b

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 30 juni 2004 @ 09:33:
Thanks, maar het gaat om de combinatie van de drie elementen. Als er 1 element verschilt dan wil ik de hele rij wel hebben. Dit kan dus niet met een sleutel volgens mij.
* curry684 snapt het even niet.... kun je je probleem wat concreter uitschrijven met wat voorbeelddata? :?

Professionele website nodig?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 30 juni 2004 @ 09:40:
Kan je dan niet beter MINUS oid pakken ?
Ik weet wel niet of alle DB's dit ondersteunen, maar ik geloof dat Oracle wel zoiets had.

MINUS gaat enkel de rows pakken uit de eerste query die niet voorkomen in de 2de resultset:
code:
1
2
3
select veld1, veld2, veld3 FROM a
MINUS
select blaat1, blaat2, blaat3 FROM b
Wat is dan het verschil met UNION? Of zal MINUS sneller zijn?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
UNION 'plakt' 2 resultsets aan elkaar, MINUS pakt het verschil tussen 2 resultsets.

Maar nu ik er zo over denk, is dat ws ook niet hetgeen de TS wil.

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 30 juni 2004 @ 10:02:
UNION 'plakt' 2 resultsets aan elkaar, MINUS pakt het verschil tussen 2 resultsets.

Maar nu ik er zo over denk, is dat ws ook niet hetgeen de TS wil.
By default, the UNION operator removes duplicate rows from the result set. If you use ALL, all rows are included in the results and duplicates are not removed.
Volgens mij doet 'ie precies hetzelfde.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

whoami schreef op 30 juni 2004 @ 09:40:
Kan je dan niet beter MINUS oid pakken ?
Ik weet wel niet of alle DB's dit ondersteunen, maar ik geloof dat Oracle wel zoiets had.

MINUS gaat enkel de rows pakken uit de eerste query die niet voorkomen in de 2de resultset:
code:
1
2
3
select veld1, veld2, veld3 FROM a
MINUS
select blaat1, blaat2, blaat3 FROM b
MINUS is geen SQL iig, misschien een Oracle toevoeging. De officiele naam daarvoor is meen ik EXCEPT (dus select ... where a EXCEPT select ... where b)
P_de_B schreef op 30 juni 2004 @ 10:03:
Volgens mij doet 'ie precies hetzelfde.
Nee, UNION geeft een resultaat dat in beide sets voorkomt maar 1x terug, maar ook alle die maar 1x in beiden zitten... Zou een rare UNION van SETs zijn als ie alleen de verschillen geeft :X

Btw, als je de verschillen van zowel SET A - b als SET B - a wilt, dan zal er zoiets gedaan moeten worden:
(SELECT a UNION SELECT b) EXCEPT (SELECT a INTERSECT SELECT b)

Maar waarschijnlijk is dat wat netter op te met queries ala:
SELECT ... WHERE a AND (x, y, z) NOT IN (SELECT ... WHERE b)

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Verwijderd schreef op 30 juni 2004 @ 09:33:
Thanks, maar het gaat om de combinatie van de drie elementen. Als er 1 element verschilt dan wil ik de hele rij wel hebben. Dit kan dus niet met een sleutel volgens mij.
Dit dan?

code:
1
2
3
4
SELECT * FROM B
LEFT OUTER JOIN A
ON B1 = A1 AND B2=A1 AND B3=A3
WHERE A.ID IS NULL

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
ACM schreef op 30 juni 2004 @ 10:17:

Nee, UNION geeft een resultaat dat in beide sets voorkomt maar 1x terug, maar ook alle die maar 1x in beiden zitten... Zou een rare UNION van SETs zijn als ie alleen de verschillen geeft :X
Ik dacht dat minus ook rijen van b terug gaf, vandaar. Ik begrijp nu wat minus doet.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

P_de_B schreef op 30 juni 2004 @ 10:19:
Ik dacht dat minus ook rijen van b terug gaf, vandaar. Ik begrijp nu wat minus doet.
Maar dan zouden ze alsnog verschillen:
resultaat van A = 1, 2, 3, 4 resultaat van B = 2, 4, 6, 8

a UNION (distinct) b geeft: 1, 2, 3, 4, 6, 8
a UNION ALL b geef: 1, 2, 3, 4, 2, 4, 6, 8

a INTERSECT b geeft: 2, 4
a EXCEPT (/minus) b geeft: 1, 3
b EXCEPT (/minus) a geeft: 6, 8

Jouw idee van minus zou dit gegeven hebben:
1, 3, 6, 8

Ow, bovenstaande query kan natuurlijk ook zo:
(a EXCEPT b) UNION ALL (b EXCEPT a) (geef die ALL mee, scheelt je een zinloze distinct-run)
Pagina: 1