summi: komplexe mysql-query funktioniert nicht wie erwartet

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?

--
  1. Hi,

    Prüf doch mal, ob die Subquery überhaupt das liefert, was Du erwartest.

    LG

    1. 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!

      --
      1. 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

        --
        -------------------
        Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
  2. 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

    1. 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

      --
      1. 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

        1. 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

          --
          1. 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

            1. 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?

              --
              1. 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