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 时,要在上面加上文字,我想加入具有相同 Reconciliation 编号的 Reconciliations 中的所有记录。

编辑:我希望发票中的代码在共享相同对帐编号的所有交易中共享

我试图通过外部应用和子查询来做,但我无法找到实现它的方法。你有什么想法吗?

4

2 回答 2

1

您似乎想将InvoiceIdinTransactions扩展到下一个值。

这是一种方法:

select t.*
       (select top 1 InvoiceId
        from Transactions t2
        where t2.id <= t.id and t2.InvoiceId is not NULL
        order by id desc
       ) as newInvoiceId
from transactions t;

然后,您可以将其替换为您的查询:

select
    t1.id   -- transaction id
    t2.num  -- reconciliation number
    t3.Code -- Invoice code
from (select t.*
            (select top 1 InvoiceId
             from Transactions t2
             where t2.id <= t.id and t2.InvoiceId is not NULL
             order by id desc
            ) as newInvoiceId
     from transactions t
    ) t1
left outer join Reconciliations t2 on t2.transid = t1.id
left outer join Invoices t3 on t3.id = t1.transid ;
于 2013-08-29T13:17:05.097 回答
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 上执行它


编辑:为了满足丢失的发票

对发票使用左连接,但您需要一个 group by 以max()将连接限制为每笔交易只有一张发票(没有max()你得到很多带有空代码的额外行):

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 回答