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.