PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kombinieren Sie zwei Tabellen zu einer neuen, sodass ausgewählte Zeilen der anderen ignoriert werden

UNION macht einfach nicht das was du beschreibst. Diese Abfrage sollte:

CREATE TABLE AS 
SELECT date, location_code, product_code, quantity
FROM   transactions_kitchen k

UNION  ALL
SELECT h.date, h.location_code, h.product_code, h.quantity
FROM   transactions_admin h
LEFT   JOIN transactions_kitchen k USING (location_code, date)
WHERE  k.location_code IS NULL;

LEFT JOIN / IS NULL um Zeilen aus der zweiten Tabelle für denselben Ort und dasselbe Datum auszuschließen. Siehe:

  • Wählen Sie Zeilen aus, die in keiner anderen Tabelle vorhanden sind

Verwenden Sie CREATE TABLE AS statt SELECT INTO . Das Handbuch:

CREATE TABLE AS ist funktional ähnlich zu SELECT INTO . CREATE TABLE AS ist die empfohlene Syntax, da diese Form von SELECT INTO ist in ECPG oder PL/pgSQL nicht verfügbar, da sie den INTO interpretieren Klausel anders. Außerdem CREATE TABLE AS bietet eine Obermenge der von SELECT INTO bereitgestellten Funktionalität .

Oder, wenn die Zieltabelle bereits existiert:

INSERT INTO transactions_combined (<list names of target column here!>)
SELECT ...

Übrigens:date würde ich nicht verwenden als Spaltenname. Es ist ein reserviertes Wort in jedem SQL-Standard und ein Funktions- und Datentypname in Postgres.