UNION simplesmente não faz o que você descreve. Esta consulta deve: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 linhas da segunda tabela para o mesmo local e data. Ver:- Selecione as linhas que não estão presentes em outra tabela
Use
CREATE TABLE AS em vez de SELECT INTO . O manual:
CREATE TABLE ASé funcionalmente semelhante aSELECT INTO.CREATE TABLE ASé a sintaxe recomendada, pois esta forma deSELECT INTOnão está disponível em ECPG ou PL/pgSQL, porque eles interpretam oINTOcláusula diferente. Além disso,CREATE TABLE ASoferece um superconjunto da funcionalidade fornecida porSELECT INTO.
Ou, se a tabela de destino já existir:
INSERT INTO transactions_combined (<list names of target column here!>)
SELECT ...
Além:eu não usaria
date como nome da coluna. É uma palavra reservada em todo padrão SQL e um nome de função e tipo de dados no Postgres.