[MySQL] Ambiguous field na inner join using (field)?

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

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Weet iemand waarom dit veld in deze query ambiguous is?

code:
1
2
mysql> select pid from xcl_players inner join xcl_games_players using (pid);
ERROR 1052: Column: 'pid' in field list is ambiguous

Na een INNER JOIN zijn beide velden toch (gegarandeerd) gelijk aan elkaar en is er toch geen sprake van dubbelzinnigheid?

  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

hij wil graag weten van welke tabel je de pid wilt hebben (ook al zijn ze gelijk)
als je nu eens in plaats van
SQL:
1
select pid from xcl_players...

doet:
SQL:
1
select xcl_players.pid from xcl_players...

[ Voor 5% gewijzigd door nxt op 20-04-2004 18:17 ]


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Dat snap ik, maar waarom is die niet slim genoeg om door te hebben dat ze gelijk zijn en dat het dus niet uit maakt?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
OlafvdSpek schreef op 20 april 2004 @ 23:37:
Dat snap ik, maar waarom is die niet slim genoeg om door te hebben dat ze gelijk zijn en dat het dus niet uit maakt?
Als ik een zaal met 100 mensen toespreek, en er zijn daar 2 OlafvdSpek's, dan ga jij ook niet weten als ik het tegen jou heb, als ik roep dat 'OlafvdSpek naar voor moet komen'.

https://fgheysels.github.io/


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
whoami schreef op 20 april 2004 @ 23:51:
Als ik een zaal met 100 mensen toespreek, en er zijn daar 2 OlafvdSpek's, dan ga jij ook niet weten als ik het tegen jou heb, als ik roep dat 'OlafvdSpek naar voor moet komen'.
Maar de inhoud van de twee velden is identiek, dus maakt het niet uit welke van de twee de server pakt. Toch?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:35

Creepy

Tactical Espionage Splatterer

Je wilt dus dezelfde tabel joinen op hetzelfde veld. Maar hoe moet mysql dat weten? Het is ook perfect mogelijk om dezelfde tabel op verschillende velden te joinen, en jij geeft maar 1 veld op.

[ Voor 11% gewijzigd door Creepy op 21-04-2004 16:11 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Creepy schreef op 21 april 2004 @ 16:08:
Je wilt dus dezelfde tabel joinen op hetzelfde veld. Maar hoe moet mysql dat weten? Het is ook perfect mogelijk om dezelfde tabel op verschillende velden te joinen, en jij geeft maar 1 veld op.
Zo is de USING syntax nou eenmaal. Als je ON gebruikt, kun je op verschillende velden joinen.
Het gaat dus over de pin in select pid, niet die in join.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Als het over de pid in je select-list gaat, geef ik hem groot gelijk. Het algoritme zou aangepast moeten worden enkel en alleen, omdat ze bij een INNER JOIN in combinatie met using toevallig gelijk zijn. Bij een OUTER JOIN hoeven ze bijvoorbeeld al niet meer gelijk te zijn.
Ze kunnen beter hun tijd besteden aan echte bugs.

Ik ben het wel met je eens dat het in deze ene specifieke situatie niet ambiguous is om geen alias/tabelnaam op te geven.

[ Voor 85% gewijzigd door cameodski op 21-04-2004 17:27 ]

Never underestimate the power of


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
OlafvdSpek schreef op 20 april 2004 @ 18:12:
Weet iemand waarom dit veld in deze query ambiguous is?

code:
1
2
mysql> select pid from xcl_players inner join xcl_games_players using (pid);
ERROR 1052: Column: 'pid' in field list is ambiguous
Omdat MySQL zich niet aan de SQL standaard houdt.
Na een INNER JOIN zijn beide velden toch (gegarandeerd) gelijk aan elkaar en is er toch geen sprake van dubbelzinnigheid?
In dit geval van een simpele select niet, maar als je even nadenkt over de definitie van een updateable view kan je vast wel verzinnen waarom het belangrijk is om nog steeds het onderscheid te (kunnen) maken. Alleen hoort door het gebruik van USING die dubbelzinnigheid te verdwijnen.

Hoe het volgens de standaard hoort te werken is als volgt:
code:
1
2
3
4
5
6
7
Men neme:
CREATE TABLE a (pid VARCHAR(8), naam TEXT);
CREATE TABLE b (pid CHAR(10), plaats TEXT);

SELECT * FROM a INNER JOIN b USING (pid)
Geeft:
pid     a.naam     b.plaats

Of pid uit tabel a of tabel b komt is helemaal niet meer zichtbaar. Sterker nog, met de keuze van datatypes zoals hierboven zal de pid kolom in de resultset het datatype VARCHAR(10) moeten hebben, wat anders is dan zowel het datatype van a.pid als dat van b.pid.

Als je applicatie afhankelijk is van dergelijke subtiliteiten in de SQL standaard heb je met MySQL een bijzonder onfortuinlijke keuze gemaakt.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
jochemd schreef op 21 april 2004 @ 17:28:
Hoe het volgens de standaard hoort te werken is als volgt:
code:
1
2
3
4
5
6
7
Men neme:
CREATE TABLE a (pid VARCHAR(8), naam TEXT);
CREATE TABLE b (pid CHAR(10), plaats TEXT);

SELECT * FROM a INNER JOIN b USING (pid)
Geeft:
pid     a.naam     b.plaats
En waarom wordt de kolom pid niet twee keer getoond. Als je een OUTER JOIN gebruikt, hoeven deze kolommen niet hetzelfde te zijn. b.pid kan dan namelijk NULL zijn.
Overigens zou een select * gewoon alle kolommen uit beide tabellen moeten geven. Volgens de manual werkt using precies hetzelfde als wanneer je ON gebruikt.
Dus deze twee queries zouden precies hetzelfde moeten doen:
code:
1
SELECT * FROM a INNER JOIN b USING (b.pid)

code:
1
SELECT * FROM a INNER JOIN b ON (b.pid = a.pid)

Never underestimate the power of


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
cameodski schreef op 21 april 2004 @ 17:48:

En waarom wordt de kolom pid niet twee keer getoond.
Omdat de SQL standaard dat zo gedefinieerd heeft.
Volgens de manual werkt using precies hetzelfde als wanneer je ON gebruikt.
Zoals ik alschreef, MySQL is een slechte ongelukkige keuze als je applicatie afhankelijk is van de subtiliteiten van de SQL standaard.
Overigens is het ook niet slim om je afhankelijk te maken van het huidige gedrag van MySQL, want in de ToDo staat dat men van plan is om de hele SQL standaard te implementeren en op dat moment zal het gedrag dus veranderen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
jochemd schreef op 21 april 2004 @ 17:52:
[...]

Omdat de SQL standaard dat zo gedefinieerd heeft.


[...]
En hoe lost MySQL dat dan op bij een LEFT OUTER JOIN als de ene pid een NULL value heeft?

edit:

Misschien moet ik MySQL maar eens installeren. Dan kan ik die bijzondere features zelf uitproberen.

[ Voor 19% gewijzigd door cameodski op 21-04-2004 17:59 ]

Never underestimate the power of


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
cameodski schreef op 21 april 2004 @ 17:58:
[...]

En hoe lost MySQL dat dan op bij een LEFT OUTER JOIN als de ene pid een NULL value heeft?
SQL:
1
2
3
4
5
6
7
mysql> SELECT * FROM a INNER JOIN b USING (pid);
+------+------+------+--------+
| pid  | naam | pid  | plaats |
+------+------+------+--------+
| A    | NULL | A    | NULL   |
+------+------+------+--------+
1 row in set (0.00 sec)
Pagina: 1