我在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
答案 0 :(得分:1)
使用distinct on
时,您需要调整order by
以匹配。所以我想你想要:
order by cap.slipNr, belege.rechNum
如果您希望最终结果集的顺序不同,请使用子查询或CTE以及另一个order by
。