2009-08-27 4 views
0

Ich habe zwei Tabellen, eine für Rechnungen und eine für eingehende Zahlungen.So geben Sie nur Zeilen zurück, die mehr als einmal inner-verbunden sind

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

Die Frage: Eine eingehende Zahlung kann wie so durch einen Fremdschlüssel zu einer Rechnung verbunden werden ich alle Rechnungen zurückkehren wollen, die gegen sie gebucht mehr als eine Zahlung haben. Für jede Rechnung möchte ich sein Dokument zurückgeben, das nur eine eindeutige ID für die Rechnung darstellt.

Hier sind einige Dinge, die ich versucht, die nicht funktioniert hat:

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 

und

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 

Irgendwelche Ideen?

Antwort

0

Die Antwort endete angesichts des Schemas, mit dem ich arbeitete, sehr viel komplexer. Ich füge hier nicht den eigentlichen Code ein, aber ich habe das Problem vor einiger Zeit gelöst. Ich wollte nur weitermachen und allen danken, dass sie geholfen haben.

1

Ich bin nicht sicher, warum der erste nicht funktioniert ... Es sollte wirklich haben. Kannst du weiter ausführen "es hat nicht funktioniert"?

Versuchen:

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

Und

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

um Ihnen zu helfen herauszufinden, was los ist.

Rob

+0

Das war schnell, danke. Die zweite Abfrage zeigt, dass es keine Zeilen mit count (*)> 1 gibt, da ich die Abfrage gestellt habe. Auch dies wird ein hilfreicher Datenpunkt sein. Ich muss tiefer in das Schema einsteigen, da ich weiß, dass Rechnungen mit mehr als einer eingehenden Zahlung gegen sie gebucht werden. – m7d

+0

Sicher. Sie lösen das, und Ihre erste Abfrage sollte funktionieren. Gruppiere nicht mit receiptnum, das wird nie funktionieren. –

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

Danke, dieser gibt keine Zeilen zurück. Das ist ein weiterer Datenpunkt, den ich verwenden kann, um dies zu debuggen. – m7d

+0

Sie müssen COUNT (*) nicht zurückgeben, um danach filtern zu können. –

+0

Ja, ich habe es gerade aufgenommen, damit er seine Ergebnisse überprüfen kann. –

1

Welche SQL-Fehler bekommen Sie? Haben Sie nach allen Feldern gruppiert, die gruppiert werden sollten?

+0

Keine Fehler, nur keine Rechnungen erhalten und ich habe Beweise, dass Rechnungen existieren, die mehr als eine eingehende Zahlung haben. Ich könnte meine Frage mit einer anderen Tabelle erweitern, die möglicherweise beteiligt sein könnte. – m7d

0

Ich denke, Ihr Beispiel SQL ist inkonsistent (im Vergleich mit der ersten SQL, die Sie zur Verfügung gestellt).
, d. H. In 1. SQL verwenden Sie Docnum für den Vergleich und in der folgenden SQL verwenden Sie Dozenz.

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: Was ist das passende Feld zum Vergleich?
t0.receiptnum = t1.docnum ODER t0.receiptnum = t1.docentry?

EDIT2: Siehe das modifizierte SQL oben.

+0

Yup - weshalb ich wollte, dass er mit einem "select *" beginnt.Wenn der Join falsch ist, wird es sehr offensichtlich sein. –

+0

Danke für die Köpfe hoch. Das war ein Tippfehler meinerseits. Die Join-Spalte ist docentry. Docnum ist nur eine weitere Spalte in Rechnungen. – m7d

Verwandte Themen