1

Ich habe eine PostgreSQL Tabelle, in der einige der Reihen schmutzig sind, da am Punkt der Dateneingabe die gender des Eintrags "unbekannt" obwohl ist es bleibt immer das gleiche, das durch seine object_id angezeigt wird, die die eindeutige Kennung des Objekts ist.Aktualisiere Spalte zu irgendeinem nicht unbekannten Wert der Spalte in einer anderen Reihe mit der gleichen Identifikation

object_id       gender 
511E1AC7128EE2E74349896B55461F27 Unknown 
511E1AC7128EE2E74349896B55461F27 Unknown 
511E1AC7128EE2E74349896B55461F27 Male 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Unknown 
56665EA256AB3757CDFA6C1CB4334C91 Unknown 
55C3BFDBD327396E912604D6E635D59B Unknown 
55C3BFDBD327396E912604D6E635D59B Unknown 
55C3BFDBD327396E912604D6E635D59B Female 

Deshalb möchte ich meine Tabelle aktualisieren, so sein:

object_id       gender 
511E1AC7128EE2E74349896B55461F27 Male 
511E1AC7128EE2E74349896B55461F27 Male 
511E1AC7128EE2E74349896B55461F27 Male 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
56665EA256AB3757CDFA6C1CB4334C91 Female 
55C3BFDBD327396E912604D6E635D59B Female 
55C3BFDBD327396E912604D6E635D59B Female 
55C3BFDBD327396E912604D6E635D59B Female 

In dem alle „unbekannten“ Spalten umgewandelt werden, was auch immer nicht unbekannten Wert der object_id hat in/einem anderen Eintrag/. Gibt es eine Weise, die ich dies in PostgreSQL tun können - oder - noch besser - Sequelize (Javascript ORM für SQL-Datenbanken?)

+0

Wenn so etwas es bestenfalls wäre getan wird eine Patchwork-Lösung, weil Ihre Daten normalisiert werden erscheint nicht. Wenn jemand Ihnen eine Patch-Work-Lösung geben würde, müsste er immer noch wissen, wie object_state aussieht. – e4c5

+0

Die üblichen Verdächtigen fehlen: Tabellendefinition und Postgres-Version. –

+0

Ich nahm mir die Freiheit, das Rauschen um 'object_state' zu ​​entfernen, das orthogonal zur Frage war und nur dazu diente, abzulenken. –

Antwort

0

Die Frage ist unvollständig, so gehe davon aus ich aktuelle Postgres Version 9.5 und diese Tabellendefinition:

CREATE TABLE object (
    object_id uuid PRIMARY KEY -- ideally a UUID 
, gender text    -- could probably be boolean 
-- rest irrelevant 
    ); 

Dann kann die Lösung sein:

UPDATE object o 
SET gender = sub.gender 
FROM (
    SELECT object_id, min(gender) AS gender 
    FROM object 
    GROUP BY 1 
    ) sub 
WHERE o.object_id = sub.object_id 
AND o.gender IS DISTINCT FROM sub.gender; 

Sie die Unterabfrage müssen, weil Aggregat oder Fensterfunktionen in UPDATE direkt nicht erlaubt.

Die Aggregatfunktion min() geschieht, weil die text'Unknown' und 'männlich' Sorten nach 'weiblich' zu arbeiten. Es würde auch für boolean funktionieren (wobei "Unbekannt" NULL wäre) und min() und max() ignorieren NULL Werte.

Die letzte WHERE Bedingung ist optional, aber es ist ratsam, sie einzuschließen, um leere Aktualisierungen zu vermeiden. Kann auf o.gender <> sub.gender vereinfacht werden, wenn die Spalte NOT NULL definiert ist;

Warum wäre es ideal, uuid den Datentyp zu benutzen?

+0

danke. um hinzuzufügen, ich denke, es wäre gut, "unbekannt" auf NULL zu setzen, also würde ich die zweite Zeile ändern in: 'SET gender = NULLIF (sub.gender, 'Unknown')'? – user3264659

+0

@ user3264659: Ja, und die letzte Zeile löschen, da in diesem Fall * alle * Zeilen aktualisiert werden sollen. –

Verwandte Themen