2009-08-27 4 views
0

J'ai deux tables, une pour les factures et une pour les paiements entrants. Un paiement entrant peut être jointe à une facture par une clé étrangère comme ceci:Comment retourner uniquement les lignes qui sont jointes plus d'une fois

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

La question: Je veux retourner toutes les factures qui ont plus d'un paiement affiché contre eux. Pour chaque facture, je veux retourner son docnum, qui est juste un identifiant unique pour la facture.

Voici quelques choses que j'essayées qui ne fonctionne pas:

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 

et

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 

Toutes les idées?

Répondre

0

La réponse a fini par être beaucoup plus complexe étant donné le schéma avec lequel je travaillais. Je n'inclus pas le code ici, mais j'ai résolu le problème il y a quelques temps. Je voulais juste suivre et remercier tout le monde pour aider.

1

Je ne sais pas pourquoi le premier n'a pas fonctionné ... Il aurait vraiment dû. Pouvez-vous développer «ça n'a pas marché»?

Essayez:

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

Et

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

pour vous aider à comprendre ce qui se passe.

Rob

+0

C'était rapide, merci. La deuxième requête montre qu'il n'y a pas de lignes avec count (*)> 1 car j'avais posé la requête. Encore une fois, ce sera un point de données utile. J'ai besoin de creuser plus profondément dans le schéma puisque je sais qu'il y a des factures avec plus d'un paiement entrant affiché contre eux. – m7d

+0

Bien sûr. Vous résolvez cela, et votre première requête devrait fonctionner. Ne pas regrouper par receiptnum, ça ne marchera jamais. –

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

+0

Merci, celui-ci ne renvoie aucune ligne. Donc, c'est un autre point de données que je peux utiliser pour déboguer cela. – m7d

+0

Vous n'avez pas besoin de retourner COUNT (*) pour pouvoir filtrer dessus. –

+0

Oui, je l'ai juste inclus afin qu'il puisse vérifier ses résultats. –

1

Quelle erreur SQL obtenez-vous? Avez-vous regroupé par tous les champs qui devaient être regroupés?

+0

Pas d'erreur, je n'ai aucune facture retournée et j'ai des preuves que les factures qui ont plus d'un paiement entrant sont comptabilisées contre elles. Je pourrais élargir ma question avec une autre table qui pourrait éventuellement être impliquée. – m7d

0

Je pense que votre exemple de SQL est incohérent (par rapport au 1er SQL que vous avez fourni).
Dans le 1er SQL, vous utilisez docnum pour la comparaison et SQL subséquent, vous utilisez 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: Quel est le champ correspondant pour la comparaison?
t0.receiptnum = t1.docnum OU t0.receiptnum = t1.docentry?

EDIT2: Voir le SQL modifié ci-dessus.

+0

Yup - c'est pourquoi je voulais qu'il commence avec un "select *".Si la jointure est fausse, ce sera très évident. –

+0

Merci pour les heads up. C'était une erreur de frappe de ma part. La colonne de jointure est docentry. docnum est juste une autre colonne dans les factures. – m7d

Questions connexes