我有两张桌子:Lancamento和Pagamento。这两个表有一个N到N的关系,因为我有第三个表:lancamentoHasPagamento。
我想查看表lancamento中与table pagamento行无关的所有行。
我这样做了:
SELECT * FROM lancamento l
LEFT OUTER JOIN lancamento_has_pagamento hp ON l.codigo != hp.codigo_lancamento
WHERE bol_quitado = 0
AND YEAR(l.data_vencimento) = 2015
AND MONTH(l.data_vencimento) = 10
AND l.valor BETWEEN 475.00 AND 525.00;
然而,这段代码重复了对lancamento_has_pagamento表格中每一行的搜索,你们有没有解决这个问题的方法呢?
示例:
lancamento_has_pagamento
让我们说我在Lacamento表中有一行数据= 2015-10-15而且valor = 500.00并且行鳕鱼是128.我期待代码只返回一次128行。
答案 0 :(得分:1)
你的连接条件应该是“=”而不是“!=”,然后你应该测试你的另一个表的外键是NULL:
SELECT * FROM lancamento l
LEFT OUTER JOIN lancamento_has_pagamento hp ON l.codigo = hp.codigo_lancamento
WHERE hp.codigo_lancamento IS NULL
//... your other conditions come here.
;
答案 1 :(得分:0)
如果我找对你,你需要这样的东西:
SELECT * FROM lancamento l
LEFT JOIN lancamento_has_pagamento hp
ON l.codigo = hp.codigo_lancamento
WHERE bol_quitado = 0
AND YEAR(l.data_vencimento) = 2015
AND MONTH(l.data_vencimento) = 10
AND l.valor BETWEEN 475.00 AND 525.00
GROUP BY l.codigo # <-- this codigo column is your key column
HAVING COUNT(hp.codigo_lancamento)=0;
甚至更简单:
SELECT * FROM lancamento l
LEFT JOIN lancamento_has_pagamento hp
ON l.codigo = hp.codigo_lancamento
WHERE hp.codigo_lancamento IS NULL
AND bol_quitado = 0
AND YEAR(l.data_vencimento) = 2015
AND MONTH(l.data_vencimento) = 10
AND l.valor BETWEEN 475.00 AND 525.00