LEFT JOIN仅出现第一次出现的条目

时间:2018-02-12 19:26:02

标签: sql postgresql

如果联接表中有多于1个匹配的条目,它们在第一个可能的条目上只匹配一次,我该如何确保。

我尝试在"transactionDate""transactionAmount"

的发票表中加入一张独特的信用卡付款表格

如果creditcard_table LEFT JOIN invoice_table可行 但是,我希望每张发票加入匹配的信用卡付款,基本上creditcard_table RIGHT JOIN invoice_table。问题是每天通常有超过1张发票,金额完全相同。

我最终创建了一个creditcard_table RIGHT JOIN invoice_table的视图,其中包含每个唯一的发票,但有多个相同信用卡付款的条目,而不是在第二个视图的加入语句中使用此视图与DISTINCT ON(creditcard_payment)。 / p>

除了信用卡付款的ID与发票表中除第一个之外的第二个可能条目不匹配外,它的效果很好。

首先查看creditcard_table RIGHT JOIN invoice_table

CREATE VIEW "2016"."2" AS SELECT DISTINCT ON (belege."belegID") belege."belegID",
    belege."rechNum",
    cap."slipNr",
    belege."rechDate",
    cap."transactionDate",
    belege."rechSum",
    cap."transactionAmount"
   FROM ("2016".belege
     LEFT JOIN "2016".cap ON (((belege."rechDate" = cap."transactionDate") 
        AND (belege."rechSum" = cap."transactionAmount"))))
      ORDER BY belege."belegID";

结果:

belegID | rechNum | slipNr |  rechDate  | transactionDate | rechSum | transactionAmount
---------+---------+--------+------------+-----------------+---------+-------------------
       1 |    2230 |   6196 | 2016-01-02 | 2016-01-02      |  234.30 |            234.30
       2 |    2231 |        | 2016-01-02 |                 |  148.30 |
       3 |    2232 |   6197 | 2016-01-02 | 2016-01-02      |   69.90 |             69.90
       4 |    2233 |        | 2016-01-02 |                 |   74.50 |
       5 |    2234 |   6198 | 2016-01-02 | 2016-01-02      |  106.80 |            106.80
       6 |    2235 |   6199 | 2016-01-02 | 2016-01-02      |   54.80 |             54.80
       7 |    2236 |   6201 | 2016-01-04 | 2016-01-04      |   41.00 |             41.00
       8 |    2237 |   6201 | 2016-01-04 | 2016-01-04      |   41.00 |             41.00
       9 |    2238 |   6202 | 2016-01-04 | 2016-01-04      |   55.40 |             55.40

我比使用那种观点" 2"在此查询中:

CREATE VIEW "2016"."3" AS SELECT belege."belegID",
    belege."rechNum",
    belege."rechDate",
    belege."rechSum",
    cap."slipNr",
    cap."transactionDate",
    cap."transactionAmount",
    cap."batchTotal"
   FROM (("2016".belege
     LEFT JOIN ( SELECT DISTINCT ON (zwei."slipNr") zwei."belegID",
            zwei."slipNr"
           FROM "2016"."2" zwei
          ORDER BY zwei."slipNr") two ON ((belege."belegID" = two."belegID")))
     LEFT JOIN "2016".cap ON ((cap."slipNr" = two."slipNr")))
  ORDER BY belege."belegID", two."slipNr";

结果:

 rechNum |  rechDate  | rechSum | slipNr
---------+------------+---------+--------
    2230 | 2016-01-02 |  234.30 |   6196
    2231 | 2016-01-02 |  148.30 |
    2232 | 2016-01-02 |   69.90 |   6197
    2233 | 2016-01-02 |   74.50 |
    2234 | 2016-01-02 |  106.80 |   6198
    2235 | 2016-01-02 |   54.80 |   6199
    2236 | 2016-01-04 |   41.00 |
    2237 | 2016-01-04 |   41.00 |   6201
    2238 | 2016-01-04 |   55.40 |   6202

正如您在1月4日的第一个表格中看到的,每个41.00有两笔付款,因此信用卡付款6201被插入两次。通过第二个查询,我尝试将信用卡付款与仅一张发票相匹配。为什么记录未插入rechNum 2236,这将是第一个匹配的记录。如果可能的话,您如何将查询更改为一个查询,以提供预期的结果。

0 个答案:

没有答案