Löschen Sie aus der Tabelle Einen Beitritt auf dem Tisch Eine Rotverschiebung in
Ich versuche zu schreiben, die folgende MySQL-Abfrage in PostgreSQL 8.0 (insbesondere mithilfe der Rotverschiebung):
DELETE t1 FROM table t1
LEFT JOIN table t2 ON (
t1.field = t2.field AND
t1.field2 = t2.field2
)
WHERE t1.field > 0
PostgreSQL 8.0 nicht unterstützt DELETE FROM table USING
. Die Beispiele in der docs sagen, dass können Sie auf Spalten anderer Tabellen in der where-Klausel, aber das funktioniert hier nicht da ich bin bei auf die gleiche Tabelle, die ich bin löschen aus. Das andere Beispiel ist eine untergeordnete select-Abfrage, aber der Primärschlüssel der Tabelle, mit dem ich arbeite, hat vier Spalten, so ich kann nicht einen Weg finden, um diese entweder.
- Welche Fehler/Ergebnisse sind Sie zu sehen. Erste, was ich sehe, scheint falsch mit deiner Abfrage ist, dass es sein sollte "LÖSCHEN" zu entfernen ("t1")
- Ja sicher, das ist eine mysql-Abfrage, die ich nicht erwarten, dass es nur funktioniert in postgresql. Ich habe nicht in der Lage zu finden ein äquivalent in Postgresql 8.0 an alle. Die syntax für das löscht ist sehr minimal.
- BTW: was ist
table
? ein keyword ? - Sind Sie sicher, dass der MySQL-Abfrage zu tun, was Sie wollen? Die
LEFT JOIN
scheint völlig nutzlos. table
ist der name der Tabelle.- Ja, du hast Recht, den linken beizutreten, ist nutzlos. Beitreten wäre das richtige Verhalten. Ich bin die Migration von code, der geschrieben wurde, vor Ewigkeiten.
- Warum sollte jemand seine Tabelle
table
? - Sie sollten Aufschluss über den genauen Zweck der Abfrage. Die kaputte MySQL-Abfrage nicht schneiden Sie es.
- Sicher. Der Zweck ist zum löschen von Datensätzen aus einer Tabelle mit einer where-Klausel, bezieht sich auf andere Spalten in derselben Tabelle. Die volle, unsimplified Anwendungsfall ist, dass ich möchte, um Datensätze zu entfernen, wo es einem anderen Datensatz in der Tabelle mit 3 Felder-matching, und 1 Feld fällt in einen Bereich von 60.
- Die Beschreibung ist ein wesentlicher Bestandteil der Frage und sollte nicht versteckt in den Kommentaren, Bearbeiten Sie die Frage und das Beispiel mit dem text. Dies muss auch die definition der Tabelle. Zu identifizieren "another record" wir müssen den Primärschlüssel. Wir müssen auch sehen
NOT NULL
Einschränkungen. Mit 37k XP Sie sollten wissen, die Grundlagen hier ..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich verstehe nicht, die mysql-syntax, aber Sie wollen wahrscheinlich diese:
DELETE
Schlagwort vonSELECT
oderSELECT COUNT(*)
, und sehen, welche Zeilen würden von der Abfrage betroffen.Amazon Redshift werden kann, basiert auf Postgres 8.0 aber ist ein sehr viel verschiedene Sache, die.
Ich benutze es nicht, aber das Handbuch informiert, dass die
MIT
Klausel ist unterstütztDELETE
- Anweisungen:Verwenden Sie einfach die moderne form:
Dies ist unter der Annahme
JOIN
stattLEFT JOIN
in deinem MySQL-statement, das würde keinen Sinn machen. Ich habe auch die BedingungAND t2.pkey <> t1.pkey
, die machen es zu einem nützlichen Abfrage. Dies schließt den Reihen der Beitritt selbst.pkey
wird die primary key-Spalte.Was diese Abfrage macht:
Löschen Sie alle Zeilen, in denen mindestens ein anderen Zeile vorhanden, in die gleiche Tabelle mit den gleichen nicht-null-Werte in
field
undfield2
. Alle diese Duplikate werden gelöscht, ohne eine einzige Zeile pro Satz.Zu halten (zum Beispiel) die Zeile mit dem kleinsten
pkey
pro Satz von Duplikaten verwenden Siet2.pkey < t2.pkey
.Einer
EXISTS
semi-join (wie @wilplasser bereits angedeutet) wäre die bessere Wahl, vor allem, wenn mehrere Zeilen verbinden konnte (eine Reihe kann nur gelöscht werden, mal trotzdem):t1
undt2
unterschiedlich sind. In meinem Fall, Sie sind die gleichen. Sorry wenn ich nicht klar, aber ich soll fürtable
werden der name der Tabelle undt1
/t2
werden Aliase. Vielen Dank für den Hinweis auf die syntax war anders, ich vermutete, es war das gleiche!AND t2.pkey <> t1.pkey
Zustand noch löschen alle zufrieden Tupel (außer wenn keine Duplikate vorhanden sind) Vielleicht meintest duAND t2.pkey < t1.pkey
??DELETE FROM tbl1 USING ...