Julian Hofmann: SELECT-Anweisung in INSERT - Denkfehler gesucht.

Hallo.

Bisher habe ich mich immer mehr oder weniger elegant um umfangreichere Statements herumgemogelt, diesmal geht's aber nicht.

Aber was ist an der Anweisung für MySQL falsch?

INSERT INTO pruefung ( F_OID ) VALUES ( SELECT f.F_OID
                                          FROM fuehrerscheinklasse f, person p
                                         WHERE ( p.name = 'Mustermann' AND
                                                 p.vorname = 'Max' AND
                                                 f.P_OID = p.P_OID ) )

Der zugewiesene Wert allein lässt sich ohne Probleme abfragen und liefert auch exakt einen Wert.

Vielen Dank schon jetzt für Eure Hilfe.

Grüße aus Würzburg
Julian

  1. Hi,

    Aber was ist an der Anweisung für MySQL falsch?

    akaif kann mySQL keine Subselects oder ist hier sehr eingeschränkt.
    Schau mal bei mysql.com nach, vielleicht findest du dort auch
    nen würgaround.

    Gruß Stefan

    1. Hi,

      kann mySQL keine Subselects oder ist hier sehr eingeschränkt.
      Schau mal bei mysql.com nach, vielleicht findest du dort auch
      nen würgaround.

      Ja. Geht afair noch nicht. Zwar ist das wohl fuer eine der naechsten Versionen geplant (oder als alpha oder beta vielleicht schon draussen), aber sonst kann man sich bisher wohl nur anderweitig behelfen.

      Der Workaround waere in diesem Fall meiner Ansicht nach, vor dem Insert das Select gesondert durchzufuehren und dann mit diesen Inhalten das Insert durchzufuerhen. Aber vielleicht weiss ja jemand noch was eleganteres.

      Gruesse
      Ralf

      1. Hi

        Ja. Geht afair noch nicht. Zwar ist das wohl fuer eine der naechsten Versionen geplant (oder als alpha oder beta vielleicht schon draussen), aber sonst kann man sich bisher wohl nur anderweitig behelfen.

        Der Insert ist eine Ausnahme wo es MySQL doch kann.

        http://www.mysql.com/doc/I/N/INSERT_SELECT.html

        und da steht auch wieso die Ursprungsvariante nicht gehen kann,
        die Syntax ist fehlerhaft.

        Gruss Daniela

        1. Hallo.

          Soweit schonmal danke, immerhin weiß ich jetzt schon mal, dass ich mich auf einem Randgebiet befinde, auf das sich nur wenige begeben (und folglich helfen können). Glückwunsch, Julian! :-(

          und da steht auch wieso die Ursprungsvariante nicht gehen kann,
          die Syntax ist fehlerhaft.

          Hm, abgesehen von zwei Klammerungen kann ich keinen Unterschied erkennen (und ohne die geht's auch nicht). Im Beispiel auf mysql.com wird lediglich aus einer Tabelle etwas selektiert, gegen einen SELECT aus zwei Tabellen ist aber nicht einzuwenden (da unabhängig von der INSERT-Tabelle).
          Was hab ich da übersehen oder falsch verstanden?

          Grüße aus Würzburg
          Julian

          1. Hi Julian

            Hm, abgesehen von zwei Klammerungen kann ich keinen Unterschied erkennen (und ohne die geht's auch nicht). Im Beispiel auf mysql.com wird lediglich aus einer Tabelle etwas selektiert, gegen einen SELECT aus zwei Tabellen ist aber nicht einzuwenden (da unabhängig von der INSERT-Tabelle).
            Was hab ich da übersehen oder falsch verstanden?

            Du hast da noch das Schlüsselwort Values stehen, das gehört da nicht hin:

            INSERT INTO pruefung ( F_OID )  ( SELECT f.F_OID
                                                FROM fuehrerscheinklasse f, person p
                                                WHERE ( p.name = 'Mustermann' AND
                                                        p.vorname = 'Max' AND
                                                       f.P_OID = p.P_OID ) )

            So müsste es klappen, ist einfach ohne das Values zwischen dem INTO und SELECT entfernt.
            Achtung, habs aber nicht getestet und da MySQL.com im Moment nicht zu erreichen
            ist nur aus SQL in a Nutshell geklaut.

            Gruss Daniela

            1. Hallo Daniela,

              Du hast da noch das Schlüsselwort Values stehen, das gehört da nicht hin:

              Ups. Hab schon soviel dranrumgebastelt heute, war irgendwie schon etwas blind. Vielen Dank, so geht's jetzt.

              Ok, wenn ich das jetzt richtig sehe (auch in Nutshell), dann ist's aber nicht möglich über eine Anweisung auch noch zusätzliche Werte mit einzufügen, wie in etwa:

              INSERT INTO pruefung ( F_OID,Auto )  ( SELECT f.F_OID
                                                  FROM fuehrerscheinklasse f, person p
                                                  WHERE ( p.name = 'Mustermann' AND
                                                          p.vorname = 'Max' AND
                                                         f.P_OID = p.P_OID ), "Mercedes" )
              Also entweder per SELECT _oder_ direkt Werte, richtig?

              Grüße aus Würzburg
              Julian

              1. Hallo Julian,

                An Daniela reiche ich zwar noch lange nicht heran, aber hier kann ich auch
                antworten:

                Also entweder per SELECT _oder_ direkt Werte, richtig?

                Richtig.
                UU koenntest du mit temporaeren Tabellen arbeiten, wenn du das unbedingt
                brauchst, aber das ist IMHO nicht die feine Englische :)

                Gruesse,
                 CK

              2. Hi Julian

                INSERT INTO pruefung ( F_OID,Auto )  ( SELECT f.F_OID
                                                    FROM fuehrerscheinklasse f, person p
                                                    WHERE ( p.name = 'Mustermann' AND
                                                            p.vorname = 'Max' AND
                                                           f.P_OID = p.P_OID ), "Mercedes" )
                Also entweder per SELECT _oder_ direkt Werte, richtig?

                http://www.mysql.com/doc/S/E/SELECT.html

                Zweiter Abschnitt:
                mysql> SELECT 1 + 1;
                         -> 2

                Daraus folgere ich jetzt einfach mal (ungetestet!) dass auch das geht:

                Select f.F_OID, 'Mercedes'
                  from ....

                Und da dass dann ein gültiges Select-Statement ist, müsstest
                du das auch im Insert brauchen können.

                Gruss Daniela

                1. Hallo Daniela.

                  Irgendwie schon interessant, wie umfangreich die Möglichkeiten sind. Nur muss man sich wohl doch einfach viel viel stärker damit befassen um alle Möglichkeiten zu kennen (oder zu wissen, wo man am besten nachschaut). Hat auch wieder geklappt.

                  Vielen Dank für Deine Hilfe.

                  Grüße aus Würzburg
                  Julian

        2. Boah Daniela,

          Der Insert ist eine Ausnahme wo es MySQL doch kann.

          Dein MySQL Wissen ist ja wirklich allertiefst beeindruckend (da habe ich neulich schon kraeftigst mit den Oehrchen geschlackert :o).

          Gruesse
          Ralf