2009-08-27 15 views
0

私は2つのテーブルを持っています.1つは請求書用と1つは入金用です。入金はそうのような外部キーによって請求書に接合することができる。内部結合の行を複数回返す方法

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

質問:私は、複数の支払がそれらに対して掲載されているすべての請求書を返すようにしたいです。それぞれの請求書について、私はdocnumを返送したいのですが、これは請求書の一意のIDです。

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 

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 

任意のアイデア:

ここでは動作しませんでした私が試したいくつかのものがありますか?

答えて

0

答えは、私が作業していたスキーマを考えればずっと複雑になっています。私はここに実際のコードを含めていませんが、少し前に問題を解決しました。フォローアップしてみんなに助けてくれたことに感謝したい。

1

なぜ最初のものがうまくいかなかったのかわかりません...本当にすべきでした。あなたは「それはうまくいかない」ということで拡大できますか?

試してみてください。

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

そして

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

あなたは何が起こっているかを把握するのに役立ちます。

ロブ

+0

すばやく、ありがとうございました。 2番目のクエリは、クエリを提出したときにcount(*)> 1の行がないことを示しています。繰り返しますが、これは有用なデータポイントになります。私はスキーマを深く掘り下げる必要があります。なぜなら、複数の入金が転記された請求書があることがわかっているからです。 – m7d

+0

それを解決すると、最初のクエリが機能するはずです。領収書番号でグループ化しないでください。動作しないでしょう。 –

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

ありがとう、この1つは行を返しません。つまり、これをデバッグするために使用できる別のデータポイントです。 – m7d

+0

フィルタリングできるようにCOUNT(*)を返す必要はありません。 –

+0

さて、彼の結果を検証できるように、私はそれを含めたばかりです。 –

1

あなたはどのようなSQLエラーが出るのですか?グループ化する必要があるすべてのフィールドでグループ化しましたか?

+0

エラーはありません。返品された請求書が返ってきていないため、複数の入金が転記された請求書が存在します。私はおそらく関与する可能性のある別のテーブルで質問を拡大するかもしれません。 – m7d

0

私はあなたの例のSQLが(あなたが提供した最初のSQLと比較して)矛盾していると思います。
つまり、比較のためにdocnumを使用している最初のSQLでは、その後のSQLでは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:比較のために一致するフィールドは何ですか?
t0.receiptnum = t1.docnumまたはt0.receiptnum = t1.docentry

EDIT2:上記の修正されたSQLを参照してください。

+0

だから私は彼が "select *"で始めることを欲しかったのです。結合が間違っていると、それは非常に明白です。 –

+0

ヘッドアップありがとう。それは私の間違いでした。結合列はdocentryです。 docnumは請求書の別の列です。 – m7d

関連する問題