UNION simplemente no hace lo que describes. Esta consulta debe:
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 para excluir filas de la segunda tabla para la misma ubicación y fecha. Ver:
- Seleccionar filas que no están presentes en otra tabla
Usa CREATE TABLE AS en lugar de SELECT INTO . El manual:
CREATE TABLE AS es funcionalmente similar a SELECT INTO . CREATE TABLE AS es la sintaxis recomendada, ya que esta forma de SELECT INTO no está disponible en ECPG o PL/pgSQL, porque interpretan el INTO cláusula de manera diferente. Además, CREATE TABLE AS ofrece un superconjunto de la funcionalidad proporcionada por SELECT INTO .
O, si la tabla de destino ya existe:
INSERT INTO transactions_combined (<list names of target column here!>)
SELECT ...
Aparte:no usaría date como nombre de columna. Es una palabra reservada en cada estándar SQL y un nombre de función y tipo de datos en Postgres.