komplexe mysql-query funktioniert nicht wie erwartet
summi
- datenbank
Habe hier eine mysql-Query die mir nicht das zurück gibt, was ich erwarte.
In der Subquery wir ein String erzeugt. Dieser enthält kommagetrennt
numerische Werte. In der äußeren Abfrage soll dann in der Tabelle guckt
werden, ob die Werte aus der Subquery vorkommen. Wenn ja, dann gib den
Datensatz zurück.
SELECT * FROM ref\_ships\_temp
AS tA
WHERE tA
.mmsinumber
IN (SELECT
REPLACE (REPLACE(tE
.value
,'\r\n',','),',,', ',') AS mmsiNumbers FROM
ref\_customersFilters
AS tE
LEFT JOIN ref\_customers
AS tF
ON
tE
.customerid
=tF
.id
WHERE tF
.secret
='hsx256' AND
tE
.type
='mmsinumber');
Das Problem ist nun folgendendes. Wenn ich kommagetrennte werte in die äußere
Abfrage schreiben bekomme ich die richtigen Datensätze zurück. Nutze ich die
Subquery erhalte ich nur einen Datensatz.
Kann mir jemand sagen wo die Ursache ist?
Hi,
Prüf doch mal, ob die Subquery überhaupt das liefert, was Du erwartest.
LG
Hi,
Prüf doch mal, ob die Subquery überhaupt das liefert, was Du erwartest.
LG
hi,
die subquery liefert genau das was ich bauche. eine string, der kommagetrennt zahlenwerte enthält. wieso aber immer nur ein ergebnis in der mainquery zurück kommt ist mein rätsel.
summi!
Hello,
die subquery liefert genau das was ich bauche. eine string, der kommagetrennt zahlenwerte enthält. wieso aber immer nur ein ergebnis in der mainquery zurück kommt ist mein rätsel.
das Subquery liefert einen String kommagetrennter Werte? Wow, OK, ich kann mir vorstellen, warum man denken könnte das funktioniert. Ich behaupte, frei jeglichen Beweises, dass das ein Irrtum ist. Ich nehme an, es wird folgendes unterstützt - entweder
SELECT FROM WHERE IN (feste, liste, mit, werten)
oder
SELECT FROM WHERE IN (SELECT spalte FROM tabelle)
Im zweiten Fall nimmt das DBMS automatischen einen "zeilenweisen" Vergleich vor. Ich glaube nicht, dass du es dazu bekommst, die zurückgegebene Kommaliste so zu behandeln wie den ersten Fall.
MfG
Rouven
yo,
hochstwahrschenlich vergleicht das dbms die gesamte ausgabe der unterabfrage und trennt nicht zwischen den kommas. um das herauszufinden, führe die unterabfrage aus, kopiere dir den string, der dabei raus kommt und führe die unterabfrage mit den string aus.
Ilja
hallo und danke für deinen tipp.
die subquery habe ich schon einzeln ausgeführt. Als ich die werte aus der subquery genommen aber und damit die abfrage startete funktionierte alles.
hier mal die ergebnismenge:
245877000,211376650,211192530,245895000,211227250,235007723,246337000,244231000,211113160,211421240,244875000,244361000,211337780,265251000,245898000,211141840,211238260,244665000,211350760,211204960,211200050,211378700,314178000,211369540,261148000,245923000,246186000,244543000,211315520,246342000,211140900,211224800,211228850,211260310,230314000,211352730,246277000,211292970,211332310,211128690,211324790,211349150,211364430,211356340,211111480,211114790,211138670,211290480,211225290,211224980,211366470,211110960,265521700,244207000,244537000,265538220,211351510,244698000,211128400,211138840,211349460,273243700,211349690,230277000,245994000,244585000,211221390,244596000,211349890,211259880,244556000,244595000,211141110,211232540,211189240,246099000,211355990,211215180,211176330,246085000,211176860,211408170,211320540,211132200,244897000,244679000,211348740,211351920,211355900,211379440,246501000,211420520,211215170,211146410,205822600,211304530,211349900,273511000,211408480,211396170,245103000,211240870,246178000,211357210,244602000,211218820,218039000,245108000,246329000,211189980,244007000,211351160,211383280,211395830,265515390,246024000,211392620,211224940,211157880,246023000,219004618,246084000,119999000,246337000,246253000,211215210,258373000,246198000,211210280,265318000,244496000,207037000,232003690,273133800,246011000,261000340,211210660,319098000,219000949,273452840,246494000,258113000,308851000,245804000,245115000,211205810,538001664,377036000,311485000,211242840,211330380,219001232,211149000,211001360,309168000,211222810,211210610,247117400,219000479,211215130,211298240
summi
yo,
hochstwahrschenlich vergleicht das dbms die gesamte ausgabe der unterabfrage und trennt nicht zwischen den kommas. um das herauszufinden, führe die unterabfrage aus, kopiere dir den string, der dabei raus kommt und führe die unterabfrage mit den string aus.
Ilja
yo,
die subquery habe ich schon einzeln ausgeführt. Als ich die werte aus der subquery genommen aber und damit die abfrage startete funktionierte alles.
dann gilt das, was Rouven und ich dir sagten, du kannst die subquery so nichts einsetzen, weil er die gesamte ausgabe der unterbabfrage zum vergleich heranzieht.
um eine unterabfrage weiterhin verwenden zu können, muss die die einzelnen werte "untereinander" von der unterabfrage ausgeben lassen, sprich für jeden wert einen eigenen datensatz.
Ilja
hoi,
richtig was du sagst. aber um in einem haufen von werten zu gucken ob dort der gewünscht wert drin ist, dafür nutze ich doch foo
IN (SELECT *....)
damit sollte es mysql doch möglichsein auch kommagetrennte werte zu überprüfen. zumal es mit manuell eingegebenen ja funktioniert.
oder verstehe ich da irgendwas falsch?
summi
dann gilt das, was Rouven und ich dir sagten, du kannst die subquery so nichts einsetzen, weil er die gesamte ausgabe der unterbabfrage zum vergleich heranzieht.
Ilja
yo,
damit sollte es mysql doch möglichsein auch kommagetrennte werte zu überprüfen. zumal es mit manuell eingegebenen ja funktioniert.
oder verstehe ich da irgendwas falsch?
eher nicht, mysql und andere datenbanksysteme werden das als einen gesamen string ansehen, da ein string ja auch komma/hochkomma enthalten kann. woher soll das dbms system wissen, diese komma oder hochkomma soll im string erhalten bleiben und bei einem anderen mal soll das dbms das als trenner für den IN operator verwenden.
also ich würde darin nicht weiter energie verbrauchen, diesen weg zu gehen, sondern die unterabfrage so gestalten, dass die jeweiligen werte in verschienden datensätze stehen.
Ilja
hoi,
also ich würde darin nicht weiter energie verbrauchen, diesen weg zu gehen, sondern die unterabfrage so gestalten, dass die jeweiligen werte in verschienden datensätze stehen.
gerade das ist ja ein problem. die werte liegen nicht als einzelne datensätze vor sondern sind mittels \r\n getrennt. ich mache aus denen dann ein komma.
gibts denn ne möglichkeit, die wieder zurück in einzelne datensätze zu bringen?
yo,
gerade das ist ja ein problem. die werte liegen nicht als einzelne datensätze vor sondern sind mittels \r\n getrennt. ich mache aus denen dann ein komma.
ist immer ein hinweis darauf, dass eventuell das daten-design nicht optimal gestalltet wurde.
gibts denn ne möglichkeit, die wieder zurück in einzelne datensätze zu bringen?
das kommt ein wenig drauf an, wie genau die daten vorliegen, ist es eine bekannte nud begrentzte anzahl von zu trennenden sätzen oder ist diese unbekannt. eventuell könnte man es auch mti deiner prozedualen erweitunrg lösen, die viele dbms anbieten wie zum beispiel PL/SQL von Oracle.
aber vorher wäre wie gesagt erst mal zu klären, in welcher genauen form die daten vorliege, selfjoins wären dann eventuell ein möglicher weg für dich.
Ilja