Como retornar somente as linhas que são inner-join'd mais de uma vez

votos
0

Eu tenho duas tabelas, uma para as facturas e uma para pagamentos recebidos. Uma entrada de pagamento podem ser unidas para uma factura por uma chave estrangeira como assim:

from invoices t1 inner join incoming_payments t2 on t1.receiptnum = t2.docnum

A pergunta: Eu quero voltar todas as facturas que têm mais de um pagamento postou contra eles. Para cada factura Quero voltar a sua DOCNUM, que é apenas um id único para a factura.

Aqui estão algumas coisas que eu tentei que não funcionou:

select t0.docnum
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
group by t0.docnum
having count(t0.docnum) > 1  

e

select t0.docnum
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry
group by t0.receiptnum, t0.docnum
having count(t0.receiptnum) > 1

Alguma ideia?

Publicado 27/08/2009 em 05:01
fonte usuário
Em outras línguas...                            


5 respostas

votos
1

O erro de SQL que você ganha? Você grupo por todos os campos que foram necessários para ser agrupados?

Respondeu 27/08/2009 em 05:13
fonte usuário

votos
1
selecionar t0.docnum, COUNT (*)
de faturas T0 junção interna incoming_payments t1 em t0.receiptnum = t1.docentry 
grupo por t0.docnum
tendo count (*)> 1

Respondeu 27/08/2009 em 05:06
fonte usuário

votos
1

Eu não sei por que o primeiro não funcionou ... É realmente deveria ter. você pode expandir em "não funcionou"?

Experimentar:

select t0.docnum, *
from invoices t0 
  inner join incoming_payments t1 on t0.receiptnum = t1.docentry 

E

select t0.docnum, count(*)
from invoices t0 
  inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
group by t0.docnum

para ajudá-lo a descobrir o que está acontecendo.

Roubar

Respondeu 27/08/2009 em 05:04
fonte usuário

votos
0

A resposta acabou por ser muito mais complexa dado o esquema que eu estava trabalhando. Eu não estou incluindo o código real aqui, mas eu resolvi o problema há um tempo atrás. Só queria acompanhar e agradecer a todos pela ajuda.

Respondeu 17/09/2010 em 21:48
fonte usuário

votos
0

Eu acho que seu exemplo SQL é inconsistente (quando comparado com o 1º SQL que você forneceu).
ou seja, em 1º de SQL que você está usando DOCNUM para comparação e no SQL posterior, você está usando docentry.

select t0.docnum, count(t1.*)
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry
group by t0.docnum
having count(t1.*) > 1

EDIT: O que é o campo correspondente para comparação?
t0.receiptnum = t1.docnumOR t0.receiptnum = t1.docentry?

EDIT2: Consulte o SQL modificado acima.

Respondeu 27/08/2009 em 05:16
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more