1

編集:請求書テーブルがtransactionIdを運ぶのを間違えました

私は3つのテーブルを持っています:

Transactions  Reconciliations             Invoices
id            num    line transId         id   Code    transId
--            ---   ---- -------          --   ----    -------------
3              1    1    3                5   Code 5   3
6              1    2    6                9   Code 9   8    
7              1    3    7                12  Code 12  11
8              2    1    8
12             2    2    12
10             3    1    10
11             3    2    11 

およびこのクエリ:

select
    t1.id   -- transaction id
    t2.num  -- reconciliation number
    t3.Code -- Invoice code
from Transactions t1
left outer join Reconciliations t2 on t2.transId = t1.id
left outer join Invoices t3 on t3.transId = t1.id

次の結果が得られます。

id      num     code
--     ---     ----
3       1       Code 5
6       1       null
7       1       null
8       2       Code 9
12      2       null
10      3       null
11      3       Code 12

しかし、私が欲しいのはこれです:

id      num     code
--      ---     ----
3       1       Code 5
6       1       Code 5
7       1       Code 5
8       2       Code 9
12      2       Code 9
10      3       Code 12
11      3       Code 12

リンクされた Invoice テーブルが null になったときに単語を追加するには、同じ調整番号を持つ調整からのすべてのレコードに結合したいと考えています。

編集:請求書のコードを、同じ調整番号を共有するすべてのトランザクションで共有したい

外部適用とサブクエリを実行しようとしましたが、それを達成する方法がわかりません。何か考えはありますか?

4

2 に答える 2

1

解決策は、 に参加する前ににReconciliations 再度Invoices参加することです。

select t.id, r.num, i.Code
from Transactions t
join Reconciliations r on r.transId = t.id
join Reconciliations r2 on r2.num = r.num
join Invoices i on i.transId = r2.transId

結合は内部結合 (一致が必要Reconciliation.num) になり、共有値を介して適切な請求書に簡単に接続できることに注意してください。内部結合を使用すると、一致する請求書行のみが取得されます。

このクエリの動作を確認するには、SQLFiddle で実行します


編集:行方不明の請求書に対応するため

max()請求書には左結合を使用しますが、トランザクションごとに結合を 1 つの請求書に制限するには、group by が必要です(max()コードが null の余分な行がたくさん取得されることはありません)。

select t.id, r.num, max(i.Code) as Code
from Transactions t
join Reconciliations r on r.transId = t.id
join Reconciliations r2 on r2.num = r.num
left join Invoices i on i.transId = r2.transId
group by t.id, r.num

上記のフィドルから請求書 12 を無効にしたこのクエリの動作を確認するには、execute it on SQLFiddle

于 2013-08-29T15:17:25.877 に答える