T-SQL : verschillend resultaat met subquery en left join

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Kenhas
  • Registratie: Oktober 2006
  • Laatst online: 10-10 16:15
Het gaat om twee tabellen met geografische data (hoewel dat er weinig toe doet). De ene tabel moet één voor één overgezet worden naar de nieuwe.
Daarvoor werkte ik met een subquery om de rijen te vergelijken.

Dit is het aantal records in de twee tabellen
select count(dossier) from [VERGUNNINGEN_CAD]8748
select count(dossier) from [VERGUNNINGEN_GRB]8655


Werk ik met een left outer join

code:
1
SELECT count(a.dossier) from [VERGUNNINGEN_CAD] A left outer join [VERGUNNINGEN_GRB] B on A.DOSSIER = B.DOSSIER where b.DOSSIER is null

krijg ik 94 aan resultaat

maar als ik werk met een subquery

code:
1
select count(dossier) from [VERGUNNINGEN_CAD] where dossier not in (SELECT dossier  FROM VERGUNNINGEN_GRB)

krijg ik 0 als resultaat

Wat zie ik over het hoofd?

2x Marstek Venus E 5.12 v153 - CT003 V117 - BMS 212 en 215


Acties:
  • +1 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Heel vreemd. Dat wordt debuggen.

Welke dossiers krijg je uit de eerste query als je `select *` doet ipv `count`?
En bestaat zo'n dossier inderdaad niet in VERGUNNINGEN_GRB?

Acties:
  • +1 Henk 'm!

  • Flythe
  • Registratie: Augustus 2006
  • Niet online
Is het mogelijk voor records uit VERGUNNINGEN_GRB om null te returnen? Dat zou betekenen dat de list die de subquery returned null's bevat waardoor NOT IN altijd een match zal geven (oftewel, je krijgt 0 resultaten). Zie SO voor een uitgebreidere uitleg.

Acties:
  • 0 Henk 'm!

  • Kenhas
  • Registratie: Oktober 2006
  • Laatst online: 10-10 16:15
winkbrace schreef op maandag 17 oktober 2016 @ 16:16:
Heel vreemd. Dat wordt debuggen.

Welke dossiers krijg je uit de eerste query als je `select *` doet ipv `count`?
En bestaat zo'n dossier inderdaad niet in VERGUNNINGEN_GRB?
Als ik gewoon Select doe, dan krijg ik netjes alle records, zowel _CAD als _GRB. Die count was eigenlijk meer om hier als voorbeeld te dienen. Stuk gemakkelijker dan rijen te kopiëren en plakken en zo.

Als ik hier en daar een dossiernummer uit de "left join" query test tegen _GRB tabel, dan zit die er effectief niet in.
Flythe schreef op maandag 17 oktober 2016 @ 16:40:
Is het mogelijk voor records uit VERGUNNINGEN_GRB om null te returnen? Dat zou betekenen dat de list die de subquery returned null's bevat waardoor NOT IN altijd een match zal geven (oftewel, je krijgt 0 resultaten). Zie SO voor een uitgebreidere uitleg.
Heb die vraag eens doorlezen en de kernzin daar is eigenlijk "This may be confusing" :$
Maar als ik het goed begrijp, zouden de queries een verschillend resultaat geven als het "zoekveld" (in dit geval 'dossier') nullable is en er een veld NULL is.
Dat haal ik hier uit:
The result of this condition is a boolean product of all comparisons within the list. Of course, a single NULL value yields the NULL result which renders the whole result NULL too.
Het veld is in principe wel nullable maar zou geen NULL mogen bevatten. Ik zal morgen op het werk eens zien of er ergens een NULL in het veld 'dossier' zit. Het zou niet mogen maar het zou zomaar eens kunnen.

Zeeeer interessant artikel trouwens. Op zich had ik er niet bij stil gestaan dat 'NOT IN' zo'n resultaat geeft als er een NULL value in de tabel zit.

Morgen eerste werk eens kijken of er een NULL waarde in de tabel zit

Bedankt alle twee

EDIT : na het herlezen van mijn openingspost begin ik te vermoeden dat het inderdaad zo'n NULL value gaat zijn.
in CAD zitter er 8748 records, in GRB zitten er 8655. Het verschil is dus 93. Als ik kijk naar het resultaat van de "left join", zouden er 94 zijn. Eén van de records in GRB zal dus een NULL bevatten

[ Voor 7% gewijzigd door Kenhas op 17-10-2016 20:03 ]

2x Marstek Venus E 5.12 v153 - CT003 V117 - BMS 212 en 215


Acties:
  • +1 Henk 'm!

  • Flythe
  • Registratie: Augustus 2006
  • Niet online
Je moet je voorstellen dat je een subquery doet waar dossiers 1,2,3 voorkomen maar ook een NULL. Wanneer je dan gaat kijken of een record uit VERGUNNINGEN_CAD voorkomt in de lijst (1,2,3,NULL) zal dat altijd true opleveren omdat de NULL er tussen staat. Het SO artikel legt het nog beter maar ook uitgebreider uit ;).

Acties:
  • 0 Henk 'm!

  • Kenhas
  • Registratie: Oktober 2006
  • Laatst online: 10-10 16:15
Het was dus inderdaad een NULL waarde

Bedankt voor de link naar het SO artikel. Veel bijgeleerd. Wist dat het altijd opletten is met NULL waardes. Maar hier had ik het niet verwacht en gewoon niet aan gedacht om te controleren op NULL waardes.

ik had niet verwacht dat "where dossier not in (1,2,3,NULL)" nooit resultaten gaat geven. Per slot van rekening zit "dossier" met waarde 20 niet in de opsomming.

Moet terug denken aan de uitspraak van een leraar van vroeger "NULL is zowel niets als alles"

2x Marstek Venus E 5.12 v153 - CT003 V117 - BMS 212 en 215

Pagina: 1