Announcement

Collapse
No announcement yet.

UPDATE INNER JOIN ist gleich LEFT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • UPDATE INNER JOIN ist gleich LEFT

    Hallo,

    ich würde gerne eine Masterdatei m updaten mit Daten r, die aus einer anderen Tabelle n stammen. Dabei müssen alle Records von m wieder vorhanden sein. Nun ist mir aufgefallen: INNER JOIN ergibt mir dasselbe wie LEFT JOIN. Im Internet und der MySQL-Dokumentation gibt es jedoch keinen Hinweis, dass INNER und LEFT OUTER join dieselben Resultate ergeben, sondern dass man die joins bei einem UPDATE wie bei einem SELECT verwenden kann. Nun bin ich mir nicht sicher und würde gerne von Euch wissen, ob es OK ist, einfach nur INNER JOIN zu verwenden für ein update der Masterdatei (ohne Verlust von Records).

    Besten Dank für Hilfe

    giordano

    Code:
    CREATE TABLE m
    (id INTEGER,
    y CHAR(1)
    );
    
    INSERT  INTO m (id,y)
    VALUES (1,'a'),
    (2,'b'),
     (3,'c');
    
    create table n
    (id INTEGER,
    r CHAR(1)
    )
    
    INSERT  INTO n (id,r)
    VALUES (1,'f'),
    (2,'g');
    
    ALTER TABLE m ADD t CHAR(1);
    
    UPDATE m
    INNER JOIN n
    ON m.id = n.id
    SET t = r

  • #2
    Hallo,

    wo soll bei einem Update ein "Verlust von Records" herkommen? Solange du kein DELETE machst, bleiben alle Datensätze erhalten. Bei einem UPDATE werden die DS nur geändert. Von der Änderung kann einer, mehrere oder alle DS betroffen sein. Warum sollten die nicht geänderten denn verschwinden?

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      Danke für die Antwort. Ich bin darauf gekommen wegen des Artikels in
      http://www.electrictoolbox.com/artic...-table-update/

      Der folgenden würde also mit einem Inner join dasselbe ergeben?

      Code:
      UPDATE product p
      LEFT JOIN productPrice pp
      ON p.productId = pp.productId
      SET p.deleted = 1
      WHERE pp.productId IS null
      Gruss
      giordano

      Comment


      • #4
        Hallo,
        Originally posted by giordano View Post
        ...Der folgenden würde also mit einem Inner join dasselbe ergeben?
        Nein, der würde mit einem INNER JOIN nicht funktionieren! Bei einem INNER JOIN gäbe es KEINEN DS für den gilt: pp.productId IS null!

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Aha, also es gehen doch Datensätze verloren (im Beispiel bei p.) bei einem UPDATE? Das steht im Widerspruch zu dem, was Du am anfang gesagt hast.

          Gruss
          girdano

          Comment


          • #6
            Ähm, also nochmal langsam: Bei einem Update gehen KEINE Datensätze verloren!!! Fakt! Je nach Bedingung werden nur manche NICHT GEÄNDERT!

            So wie der Left Join inkl. der Where Bedingung formuliert ist, ändert (nicht löscht!) er alle DS in product, die KEINE Entsprechung in productPrice (für p.productId = pp.productId) haben. Diese Bedingung kannst du mit einem Inner Join überhaupt nicht realisieren. Und nur das habe ich gesagt und das steht auch in keinster Weise im Widerspruch zu meinen bisherigen Aussagen.

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo Falk,

              Habes nun begriffen. Besten Dank für die Hilfe. Hat mich ziemlich weiter gebracht.

              Gruss
              giordano

              Comment

              Working...
              X