Toon posts:

[MySQL] Error in subquery *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem, ik ben een database aan het overzetten van MS Access naar MySQL (mysqld-4.0.17-nt), dit ging allemaal perfect.. Alleen nu werkt de volgende query wel onder Access en niet onder MySQL:

SELECT RechtID, iif(RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID = 1), True, False) AS Toegewezen FROM Rechten;

Dus ik zoeken in de documentatie van MySQL, kan ik niks vinden over het IFF commando (imediate if) dus ik eens testen met

SELECT Naam FROM Rechten WHERE RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID = 1)

En die geeft dezelfde melding wat ik erg vreemd vindt, want MySQL hoort wel subquerys te ondersteuen, ook met de IN functie.

Weet iemand waar dit aan ligt? Of een vervangende query voor de 1e query?

  • TeeDee
  • Registratie: Februari 2001
  • Nu online

TeeDee

CQB 241

MySQL heeft toch geen Subquerys?
Zie het nu ook.

/edit:
Wat is trouwens de foutmelding?

[ Voor 55% gewijzigd door TeeDee op 18-12-2003 09:47 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
http://www.mysql.com/doc/en/Subqueries.html

hieruit concludeer ik van wel..

[ Voor 25% gewijzigd door Verwijderd op 18-12-2003 09:46 ]


  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 19:31

Tux

Welke versie van MySQL draai je?

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Verwijderd

Topicstarter
Foutmelding:

[Server] ERROR 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID =

Verwijderd

Topicstarter
Versie: mysqld-4.0.17-nt

  • TeeDee
  • Registratie: Februari 2001
  • Nu online

TeeDee

CQB 241

Misschien heel stom :)

Maar wordt je query in je source niet afgebroken ofzo?
Zoals ik het lees stop je query bij: GebruikerID =
Daarna niks meer.

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

no comment


edit sorry slecht gelezen

[ Voor 86% gewijzigd door Verwijderd op 18-12-2003 09:50 ]


Verwijderd

Topicstarter
hmmz.. lijkt me vrij stug, zit de query nu te proberen met het MySQL control center, en heb hem nu opgebroken in meerdere regels wat heel normaal is bij sql query's, maar de melding blijft hetzelfde..

(en dan had de 2e query nooit dezelfde melding kunnen veroorzaken)

Verwijderd

Verwijderd schreef op 18 december 2003 @ 09:46:
Foutmelding:

[Server] ERROR 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID =
Is dit de volledige foutmelding, anders komt criteria=1 niet over, of is dit maar een deel van de query??

Verwijderd

Topicstarter
Dat is inderdaad de hele foutmelding,
maar hoe kan dat dan niet overkomen??

  • TeeDee
  • Registratie: Februari 2001
  • Nu online

TeeDee

CQB 241

Post anders eens wat meer source code...

Heart..pumps blood.Has nothing to do with emotion! Bored


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 09-05 11:54

VisionMaster

Security!

SELECT RechtID, iif(RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID = 1), True, False) AS Toegewezen FROM Rechten;

Waar wil je dat ik begin met de uitleg dat MySQL (en anderen) dit niet zo snel zal begrijpen als Query?
Access is een zeer slechte database om te leren, omdat er velen functies zijn die als gewoon worden geacht, maar absoluut nooit begrepen kunnen worden door andere DBMS-en. Alleen al uit je 'foute' query kon ik al afleiden dat je Access gebruikte :P

code:
1
2
3
4
SELECT RechtID, 'True' AS Toegewezen 
FROM Rechten 
WHERE RechtID IN (SELECT RechtID 
                          FROM GebrRecht WHERE GebruikerID = 1);

En de volgende query
code:
1
2
3
4
SELECT RechtID, 'False' AS Toegewezen 
FROM Rechten 
WHERE RechtID NOT IN (SELECT RechtID 
                       FROM GebrRecht WHERE GebruikerID = 1);

zullen een aardige oplossing kunnen vormen.

mogelijk:
code:
1
2
3
4
5
6
7
8
9
SELECT RechtID, 'True' AS Toegewezen 
FROM Rechten 
WHERE RechtID IN (SELECT RechtID 
                          FROM GebrRecht WHERE GebruikerID = 1)
UNION
SELECT RechtID, 'False' AS Toegewezen 
FROM Rechten 
WHERE RechtID NOT IN (SELECT RechtID 
                       FROM GebrRecht WHERE GebruikerID = 1);

[plaagmode]Access is geen database[/plaagmode] :+


ps: ik wil ook even reageren op iedereen die maar steeds herhaaldelijk vraagt om een stukkie sourcecode ... de TS wil met Access-specifieke Query-codes het zaakie porten naar MySQL :+
Ergo. je heb hier geen sourcecode voornodig en het is op de eerste plaats nutteloos die te posten. (Misschien als er andere problemen zich voor doen ... ok dan misschien wel...)
Die Access codes moeten eruit that's it ...

[ Voor 56% gewijzigd door VisionMaster op 18-12-2003 11:01 ]

I've visited the Mothership @ Cupertino


  • Kroontje
  • Registratie: Juli 2002
  • Laatst online: 21:19

Kroontje

...

Versie 4.1 kan overweg met Subquery's, 4.0 nog niet..
Starting with version 4.1, MySQL supports all subquery forms and operations which the SQL standard requires, as well as a few features which are MySQL-specific.

[ Voor 3% gewijzigd door Kroontje op 18-12-2003 11:16 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ergo. je heb hier geen sourcecode voornodig en het is op de eerste plaats nutteloos die te posten
Die Access codes moeten eruit that's it ...
Waarom? Die geven toch een goede indruk van de werking van de query? In SQL Server had je bevoorbeeld dit kunnen oplossen met een CASE WHEN, ik ken niet voldoende van MySQL om een MySQL variant te geven, maar ik vermoed dat MySQL ook wel een dergelijke functie heeft.

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


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 09-05 11:54

VisionMaster

Security!

P_de_B schreef op 18 december 2003 @ 11:18:
[...]
Waarom? Die geven toch een goede indruk van de werking van de query? In SQL Server had je bevoorbeeld dit kunnen oplossen met een CASE WHEN, ik ken niet voldoende van MySQL om een MySQL variant te geven, maar ik vermoed dat MySQL ook wel een dergelijke functie heeft.
CASE WHEN van SQL server is ook een add-on database specifieke query-code. Dit heet in iedere database weer anders.

Maar wat ik nu probeer duidelijk te maken is dat de SQL die hierbovenstaant, in gevoerd door de TS, absoluut nooit zal worden begrepen in MySQL. Waarom zou je verder gaan als je basis rot is? (in dit geval de query)

I've visited the Mothership @ Cupertino


Verwijderd

Topicstarter
En ik maar denken dat SQL toch een redelijke standaard was... maar iedere DBMS heeft dus weer zijn eigen specifieke syntax :S

Visionmaster, bedankt voor jouw query.. zodra ik weer bij de MySQL server kanz al ik hem testen.. Hij werkt op de access database goed.. Alleen er zitten nog wel subquery's in, maar kan mij niet voorstellen dat MySQL 4.0 die helemaal niet ondersteund...

[ Voor 52% gewijzigd door Verwijderd op 18-12-2003 12:16 ]


Verwijderd

Topicstarter
Helaas werkt de query van VisionMaster ook niet :S

  • Kroontje
  • Registratie: Juli 2002
  • Laatst online: 21:19

Kroontje

...

Verwijderd schreef op 18 december 2003 @ 11:57:
En ik maar denken dat SQL toch een redelijke standaard was... maar iedere DBMS heeft dus weer zijn eigen specifieke syntax :S

Visionmaster, bedankt voor jouw query.. zodra ik weer bij de MySQL server kanz al ik hem testen.. Hij werkt op de access database goed.. Alleen er zitten nog wel subquery's in, maar kan mij niet voorstellen dat MySQL 4.0 die helemaal niet ondersteund...
Had het een aantal topics hierboven al geplaatst, maar onderstaande quote heb ik dus van de MySQL site..
Starting with version 4.1, MySQL supports all subquery forms and operations which the SQL standard requires, as well as a few features which are MySQL-specific.
Ik had hier ook nog de 4.0 versie. Geprobeerd om een subquery te draaien, lukte niet.. Een update naar 4.1 Alpha gedaan en ja hoor, werkt prima !

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 09-05 11:54

VisionMaster

Security!

Ow ja ... das waar ook ... uhm geen subselects ... dan maar even omschrijven: :)
code:
1
2
3
4
SELECT RechtID, 'True' AS Toegewezen 
FROM Rechten, GebrRecht
WHERE Rechten.RechtID = GebrRecht.RechtID 
AND GebrRecht.GebruikerID = 1;

code:
1
2
3
4
SELECT RechtID, 'False' AS Toegewezen 
FROM Rechten, GebrRecht
WHERE Rechten.RechtID <> GebrRecht.RechtID 
AND GebrRecht.GebruikerID = 1;

of:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT RechtID, 'True' AS Toegewezen 
FROM Rechten, GebrRecht
WHERE Rechten.RechtID = GebrRecht.RechtID 
AND GebrRecht.GebruikerID = 1

UNION

SELECT RechtID, 'False' AS Toegewezen 
FROM Rechten, GebrRecht
WHERE Rechten.RechtID <> GebrRecht.RechtID 
AND GebrRecht.GebruikerID = 1;

Geen subselects meer ...

SQL is erg mooi gestandaardiseerd, ECHTER, maken alle DBMS bouwers van Oracle tot Access en van MySQL tot MS SQLServer hun eigen toevoegingen op de mogelijke functies. Dit kunnen systeemfuncties zijn, dit kunnen ook algoritmische functies zijn.
MySQL is erg beperkt in zijn functionaliteiten omdat het een betrekkelijke jong ontwikkelde database is, die zich op verschillende fronten erg goed kan bewijzen.
Microsoft producten (NOFI!) hebben vaak de neiging om zeer veel handige functies aan te bieden aan (ook niet) programmeurs/db-admins/(standaard) users.
Erg leuk allemaal, maar zo vertroebelt de standaard in de extra functies. Mijn lijfkeur met databases is, gebruik zoveel mogelijk tot altijd standaard basic SQL statements. Dit verzorgt minder problemen bij DBMS migraties. ;)

ps: volgens mij komt deze query wel erg in de buurt naar je wens...
check het en meld het, als ik fouten maak wil ik er ook van leren!

[ Voor 14% gewijzigd door VisionMaster op 19-12-2003 02:33 ]

I've visited the Mothership @ Cupertino


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

code:
1
2
3
4
5
6
SELECT
  Rechten.RechtID,
  (COUNT(GebrRecht.RechtID) > 0) AS toegewezen
FROM
 Rechten LEFT JOIN GebrRecht 
       ON Rechten.RechtID = GebrRecht.RechtID AND GebrRecht.GebruikerID = 1

Zoiets werkt toch ook wel?

Waarschijnlijk ook sneller dan die subselect van je...

[edit]
Owja
iif(RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID = 1), True, False)
en
RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID = 1)

zijn equivalent ;)

[ Voor 33% gewijzigd door ACM op 19-12-2003 10:28 ]


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 31-03 15:20
ACM schreef op 19 december 2003 @ 10:24:
Owja
iif(RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID = 1), True, False)
en
RechtID IN (SELECT RechtID FROM GebrRecht WHERE GebruikerID = 1)

zijn equivalent ;)
De eerste levert een boolean op, de tweede een (waarschijnlijk) integer of null. :+

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nee, de 2e levert een boolean op (zelfs bij een lege result uit de subselect, net getest)...

[ Voor 52% gewijzigd door ACM op 19-12-2003 23:52 ]


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 31-03 15:20
ACM schreef op 19 december 2003 @ 23:48:
Nee, de 2e levert een boolean op (zelfs bij een lege result uit de subselect, net getest)...
Indeed. :X

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1