Estou tentando executar uma consulta MySQL utilizando a NOT EXISTS
função MySQL em um sistema legado (executando MySQL 4.x). Abaixo está uma consulta simples que retorna algumas colunas de duas tabelas (com um INNER JOIN).
NB customerId
e accountId
são os mesmos valores .. é um sistema muito antigo :(
SELECT d.customerId, d.customerName, a.status
FROM DetailedDebtorsData AS d
INNER JOIN accounts AS a ON a.account_uid = d.customerId
ORDER BY d.date ASC;
+---------------+----------------------+--------+
| customerId | customerName | status |
+---------------+----------------------+--------+
| 145060 | Alan Smith | active |
| 68742 | John Doe | active |
+---------------+----------------------+--------+
Eu tenho outra tabela que usarei como uma tabela de 'exceções', em essência, se o customerId (com sua coluna account_id relacionada nas exclusões) for encontrado na tabela de exceções, NÃO quero retornar a linha relacionada do account_payment_terms
DetalhadoDebtors tabela acima.
account_payment_terms
tabela (para exclusões)
mysql> SELECT account_id, created_date FROM account_payment_terms;
+------------+---------------------+
| account_id | created_date |
+------------+---------------------+
| 145060 | 2023-11-20 13:23:03 |
+------------+---------------------+
Como o account_id 145060
existe na accountPaymentTerms
tabela, não quero retornar a linha associada (que possui o mesmo id 145060) na DetailedDebtors
tabela a ser retornada.
Aqui está a consulta que estou tentando executar com NOT EXISTS()
SELECT d.customerId, d.customerName, a.status
FROM DetailedDebtorsData AS d
INNER JOIN accounts AS a ON a.account_uid = d.customerId
WHERE NOT EXISTS (
SELECT 1
FROM account_payment_terms AS apt
WHERE apt.account_id = d.customerId
)
ORDER BY d.date ASC;
Isso gera um erro e me dá o seguinte erro, mas quero que WHERE NOT EXISTS simplesmente retorne apenas uma linha, a linha que NÃO ESTÁ na account_payment_terms
tabela.
Erro retornado no MySQL
ERROR 1064 (HY000): You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS (
SELECT 1
FROM account_payment_terms AS
Resultado Esperado (retorno 1 linha)
+---------------+----------------------+--------+
| accountId | customerName | status |
+---------------+----------------------+--------+
| 68742 | John Doe | active |
+---------------+----------------------+--------+
Resultado real (retorna 2 linhas)
+---------------+----------------------+--------+
| accountId | customerName | status |
+---------------+----------------------+--------+
| 145060 | Alan Smith | active |
| 68742 | John Doe | active |
+---------------+----------------------+--------+
O que estou fazendo de errado?
Aqui está uma solução para fazer uma junção de exclusão no MySQL 4.0: