如何按联接表给出的顺序加入

时间:2018-02-11 16:06:58

标签: sql postgresql

我在postgresql v10数据库中有两个表。 第一张表存储信用卡单,第二张表存储发票。 我想根据交易日期和交易金额为每个信用卡交易找到相应的发票。

 SELECT cap."slipNr",
    belege."rechNum",
    cap."transactionAmountOriginal",
    belege."rechSum",
    cap."transactionDate",
    belege."rechDate"
   FROM ("2016".cap
     JOIN "2016".belege ON (((cap."transactionDate" = belege."rechDate") AND (cap."transactionAmountOriginal" = belege."rechSum"))))
  WHERE ((cap."transactionDate" = belege."rechDate") AND (cap."transactionAmountOriginal" = belege."rechSum"))
  ORDER BY cap."slipNr"

所有内容都按预期工作,直到每天有多个发票与匹配的transactionAmount匹配。当然,我可以通过SELECT DISTINCT ON (cap.slipNr)解决这个问题,但是,正如您在屏幕截图中看到的那样,查询不会对发票表进行排序,而是采用随机匹配​​条目。 slipNr的第一个对应条目是rechNum 2242,而不是表中的真实第一个条目2236。

belege.rechNum有一个升序索引。 “belege”表中的数据按“rechNum”

排序
slipNr | rechNum | transactionAmountOriginal | rechSum | transactionDate |  rechDate
--------+---------+---------------------------+---------+-----------------+------------
   6196 |    2230 |                    234.30 |  234.30 | 2016-01-02      | 2016-01-02
   6197 |    2232 |                     69.90 |   69.90 | 2016-01-02      | 2016-01-02
   6198 |    2234 |                    106.80 |  106.80 | 2016-01-02      | 2016-01-02
   6199 |    2235 |                     54.80 |   54.80 | 2016-01-02      | 2016-01-02
   6201 |    2242 |                     41.00 |   41.00 | 2016-01-04      | 2016-01-04
   6201 |    2236 |                     41.00 |   41.00 | 2016-01-04      | 2016-01-04
   6201 |    2237 |                     41.00 |   41.00 | 2016-01-04      | 2016-01-04
   6201 |    2241 |                     41.00 |   41.00 | 2016-01-04      | 2016-01-04
   6202 |    2238 |                     55.40 |   55.40 | 2016-01-04      | 2016-01-04

1 个答案:

答案 0 :(得分:1)

使用distinct on时,您需要调整order by以匹配。所以我想你想要:

order by cap.slipNr, belege.rechNum

如果您希望最终结果集的顺序不同,请使用子查询或CTE以及另一个order by