[MS SQL] Bug bij niet bestaande kolom in subquery?

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

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
5
USE PUBS
GO

SELECT au_id, au_lname FROM authors 
WHERE au_id NOT IN (SELECT au_id FROM Publishers)

In bovenstaande query zit een fout. De kolom au_id bestaat niet in de Tabel Publishers, toch krijg ik geen foutmelding bij het runnen van de query, ik krijg gewoon geen resultaten.

Als ik een kolom gebruik die niet in de tabel Authors bestaat krijg ik wel de -verwachte- foutmelding 'Invalid columnname'. Zie ik hier iets over het hoofd, is dit by design of is dit een bug?

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


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Ehm, waar run je de query?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In Query Analyzer, of bedoel je dat niet?

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


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Klopt ... dit gedrag heb ik vaker gezien, en kan ik reproduceren op vier verschillende servers, allen 2000 SP4. In 2005SP1 krijg je wel de verwachte foutmelding.

Onzin, fout getest |:( :P

[ Voor 9% gewijzigd door kenneth op 18-09-2006 16:03 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

In principe kan hij in de subquery ook bij de kolommen van de hoofdquery.
Dus is er maar een au_id en gebruikt hij die waarschijnlijk.

Who is John Galt?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ja, maar ik zeg specifiek dat hij au_id uit de tabel Publishers moet halen, die is er niet dus zou ik een foutmelding moeten krijgen IMHO.

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


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Oh wacht, inderdaad ja ... hij gebruikt de au_id van de parent-query ... soort ongewilde correlatie :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

P_de_B schreef op maandag 18 september 2006 @ 15:57:
Ja, maar ik zeg specifiek dat hij au_id uit de tabel Publishers moet halen, die is er niet dus zou ik een foutmelding moeten krijgen IMHO.
Nee hoor, dat zeg je niet :)

SQL:
1
2
SELECT au_id, au_lname FROM authors 
WHERE au_id NOT IN (SELECT Publishers.au_id FROM Publishers)


Zo wel :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:37
Idd, ik ben daar al eens op gebotst in een 'productie omgeving' trouwens denk ik.
(Dan zit je wel ff te zoeken naar waar die bug kan zitten hoor 8)7 )

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Nou, ik ben toch echt van mening dat ik dat wel bedoel :P

Wellicht is het zo te verklaren, maar ik vind het maar vreemd gedrag. Ik ga er echt vanuit dat hij de subquery apart evalueert.

Dan zou de volgende query volgens mij met een 'ambigious columnname' foutmelding moeten komen:
SQL:
1
SELECT au_id from authors WHERE au_id not in (SELECT au_id FROM Titleauthor)

en dat doet 'ie niet. (het resultaat is overigens wel wat ik zou verwachten, alle au_id's die niet in de tabel titleauthor voorkomen).

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


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

P_de_B schreef op maandag 18 september 2006 @ 16:05:
Nou, ik ben toch echt van mening dat ik dat wel bedoel :P
Dat zal best, maar dan moet je dat ook zeggen :P
Wellicht is het zo te verklaren, maar ik vind het maar vreemd gedrag. Ik ga er echt vanuit dat hij de subquery apart evalueert.
Het komt vreemd over, maar hij kan de subquery niet apart evalueren omdat deze gecorreleerd kan zijn. In jouw situatie wil je dat natuurlijk niet, maar het zou in dit geval kunnen:

SQL:
1
2
SELECT column1 FROM TableA WHERE id IN (
    SELECT id FROM TableB WHERE column1 = column2)
Waar column1 uit TableA komt, en column2 uit TableB.

Daarom wordt een subquery niet apart geevalueerd.
Dan zou de volgende query volgens mij met een 'ambigious columnname' foutmelding moeten
Nee hij kijkt eerst naar de eigen scope, dan erboven :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Om deze reden is het ook altijd verstandig om altijd aliasen te gebruiken en alle columns te prefixen met de aliasen die je hebt toe gekend.

Op die manier sluit je elke mogenlijke manier uit om de verkeerde column te selecteren ( Ja ik heb het dus ook wel eens in een productie omgeving gezien ;), sindsdien gebruik ik dus ook overal aliasen. Zelfs in eenvoudige queries )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1