subquery in select-statement fout, hoe kolom per taal maken op tabel met vertalingen

Status
Niet open voor verdere reacties.

Chris Cools

Gebruiker
Lid geworden
19 okt 2008
Berichten
152
Hallo,

tot hiertoe maakte ik mijn query's altijd in MS acces met de query builder, en door query op query te bouwen duurt het voor sommige query's enorm lang eer ze gelopen hebben.
Daarom probeer ik me nu de sql taal eigen te maken in de hoop dat ik de query's dan efficiënter (lees sneller) kan maken.

Mijn vraag:
ik heb een standaard tabel met te selecteren kleuren "dbo.t_colour" en een tabel met vertalingen van de kleuren in 4 verschillende talen "dbo.d_colour".
via sql kan ik een lijst maken waarbij onder mekaar voor kleur 1 de 4 vertalingen staan, dan voor kleur 2 enzoverder.
Maar ik wil nu een lijst van de verschillende kleuren, met daarachter telkens een kolom voor elke taal.
dus: kleur, nederlands, frans, engels, duits, en dus voor elke kleur maar 1 rij ipv 1 rij voor elke vertaling.

In MS acces maakte ik dus eerst een query die me telkens id_colour en een taal gaf, zo had ik er 1 voor elke taal.
Dan maakte ik een 5de query met de verschillende kleuren en sleepte ik de vorige querys erbij en linkte die dan allemaal aan het unieke veld id_colour.

Ik vermoed dat dat in SQL in 1 statement kan?
met wat zoeken op het net kwam ik tot onderstaande:

[SQL]select k.id_colour, k.colour_code, k.active, c.id_colour,c.id_language, c.description , c.active,
(select c.description from dbo.d_colour where c.id_language = 1 )as vertaling_eng
from dbo.t_colour k join dbo.d_colour C on k.id_colour = c.id_colour
where k.active = 1[/SQL]

Maar dan krijg ik de melding dat de subquery meer dan 1 waarde teruggeeft en krijg dus geen resultaat.

Kan iemand me op het juiste pad zetten naar de oplossing of aangeven waar ik hierover info zou kunnen vinden om verder te geraken?

alvast bedankt!

mvg,

Chris
 
Wellicht denk ik te simpel, maar het riekt naar een kruistabelletje. Gewoon in Access te maken :).
 
:-) dat kan idd, maar het is voor mezelf net de point om sql statements te leren schrijven.
en deze query kan idd beter in een kruistabel, maar het gaat me dus meer om het leren van het principe en of het uberhaupt mogelijk is.

grtz,

chris
 
Dus je wilt een onmogelijke query schrijven terwijl er een prachtige fatsoenlijke oplossing is? Wat is dat voor instelling? Je kunt vast moeilijke queries schrijven voor situaties die je alleen met moeilijke queries kunt oplossen... En die ga je heus wel tegenkomen :). Misschien moet je de vraag ook maar anders stellen, want je wilt dus geen oplossing voor je probleem; je wilt een probleem voor een oplossing. Persoonlijk steek ik mijn tijd liever in zinnigere dingen.
 
Basisquery = ophalen van kleureigenschappen uit t_colour (id, code, active) --> dit geeft meteen alle rijen voor in het uiteindelijke resultaat
Een omschrijving van een bepaalde taal ophalen = LEFT OUTER JOIN op id_colour (want dit geeft aan welke kleur het is), maar ook op id_language (want dit geeft aan welke taal je wil opzoeken). LEFT OUTER JOIN wordt gebruikt omdat er misschien geen vertaling wordt gevonden, maar alle rijen uit de 'linkse tabel' (= tabelresultaat van de query voor de join wordt uitgevoerd, bij ons het resultaat van basisquery) wel in het eindresultaat moeten staan. Als er geen vertaling is gevonden zal de waarde van het veld voor die taal NULL zijn.

[SQL]SELECT k.id_colour, k.colour_code, k.active
, vertaling_eng.description AS eng
-- andere talen hier toevoegen als kolommen, bvb:
-- , vertaling_fr.description AS fr
FROM dbo.t_colour k
LEFT OUTER JOIN dbo.d_colour vertaling_eng ON ((k.id_colour = vertaling_eng.id_colour) AND (vertaling_eng.id_language = 1))
-- en hier dan ook linken met de andere talen, met juiste id_language
-- LEFT OUTER JOIN dbo.d_colour vertaling_fr ON ((k.id_colour = vertaling_fr.id_colour) AND (vertaling_fr.id_language = 2))
WHERE k.active = 1[/SQL]
 
Dat levert, als ik zo de query bekijkt, geen resultaat op waarbij de talen een eigen kolom krijgen. En dat vraagt TS. Maar ja, dat doe je ook met een kruistabel en dat wil hij niet. Wil je elke taal in een eigen tabel, zodat je kunt groeperen met Group By, dan moet je dus allemaal aparte velden definiëren, voor elke taal één. En dat doe je an sich dan wel met subqueries, en als je het goed doet bevat elk veld dan ook altijd één waarde, een voorwaarde voor het slagen van de missie. En ik wens TS daar veel succes bij, maar ik ga 'm niet maken, ik maak wel een kruistabelletje :).
 
Aangezien OctaFish de query niet kan volgen, heb ik die even als voorbeeld online gezet zodat je er zelf mee kan spelen en het resultaat bekijken: http://sqlfiddle.com/#!9/247a84/8

Zoals gevraagd komen alle talen dus mooi als kolommen naast elkaar op eenzelfde rij. SQLFiddle lijkt wle kolomaliassen niet te ondersteunen, dus de kolomheader zal voor elke taal 'description' tonen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan