购买请求主机

prm_voucher_no| project_id| status_id|  request_date
17                 46           3      11-6-2016 0:00
18                 46           3      20-6-2016 0:00
19                 46           3      216-2016 0:00

购买请求详情
prm_voucher_no| item_id|    request_quantity
17                80         50
17                81         100
18                80         75
19                83         10
19                81         35
19                82         120

采购订单主
pom_voucher_no| prm_request_id  |supplier_id
16                  17              14
17                  18              14
18                  19              15

采购订单详情
pom_voucher_no| approved_quantity|  rate
16                     50           1000
16                     100          1500
17                     75           150
18                     10           2500
18                     35           3000
18                     120          1700

当我运行下面的查询时,它会给出14行(返回重复的行)。。请参阅下面的输出表。。
select prm.prm_voucher_no,prm.project_id,prm.status_id,prd.requested_quantity,prd.item_id,pom.pom_voucher_no,pom.supplier_id,pod.rate,pod.approved_quantity
from purchase_request_master prm
left join purchase_request_details prd on prd.prm_voucher_no=prm.prm_voucher_no
left join purchase_order_master pom on prm.prm_voucher_no=pom.request_id
left join purchase_order_details pod on pom.pom_voucher_no=pod.pom_voucher_no
where prm.project_id=46 and ( EXTRACT(MONTH FROM prm.request_Date)=6) and (EXTRACT(YEAR FROM prm.request_Date)=2016)
group by prm.voucher_no,prm.project_id,prm.status_id,prd.requested_quantity,prd.item_id,pom.voucher_no,pom.supplier_id,pod.rate,pod.approved_quantity
order by prm.voucher_no

我尝试了内部连接、distinct、distinct LEST、GROUPBY、临时表、with子句所有这些方法。。但没用,每次都是重复的一行
如何解决这个问题。。
输出
prm_voucher_no| project_id| status_id|item_id|request_quantity |pom_voucher_no| supplier_id|approved_quantity |  rate
   17             46           3         80       50                 16               14       100               1000
   17             46           3         81       100                16               14       75                1500
   17             46           3         80        75                16               15       10                150
   17             46           3         81        10                16               14       35                10
   18             46           3         81        35                17               14       120               35
   19             46           3         80        120               18               15       50                120
   19             46           3         81        50                18               14       100               1000
   19             46           3         82        100               18               14       75                1500
   19             46           3         80        75                18               15       10                150
   19             46           3         81        10                18               14       35                10
   19             46           3         82        35                18               14       120               35
   19             46           3         80        120               18               15       35                120
   19             46           3         81        35                18               14       50                1500
   19             46           3         82        50                18               15       100               1700

预期产量
prm_voucher_no| project_id| status_id|  item_id|    request_quantity|   pom_voucher_no| supplier_id|approved_quantity|  rate
    17             46          3          80             50                  16             14           100            1000
    17             46          3          81             100                 16             14           75             1500
    18             46          3          81             35                  17             14           120              35
    19             46          3          80             120                 18             15           50              120
    19             46          3          81             50                 18              14          100             1000
    19             46          3          82             100                 18             14          75              1500

最佳答案

我认为问题出在你的数据模型本身。理想情况下,在两个“detail”表中都有一个line_number字段,这将用于联接:

create table purchase_request_details (
    prm_voucher_no integer,
    prm_voucher_line integer,    // Add this
    item_id integer,
    request_quantity
)

create table purchase_order_details (
    pom_voucher_no integer,
    pom_voucher_line integer,    // and this
    approved_quantity integer,
    rate integer
)

然后这个查询将给出您要查找的结果:
select
  prm.prm_voucher_no,prm.project_id,prm.status_id,prd.request_quantity,
  prd.item_id,pom.pom_voucher_no,pom.supplier_id,pod.rate,pod.approved_quantity
from
  purchase_request_master prm
  left join purchase_request_details prd on
    prd.prm_voucher_no=prm.prm_voucher_no
  left join purchase_order_master pom on
    prm.prm_voucher_no=pom.prm_request_id
  left join purchase_order_details pod on
    pom.pom_voucher_no=pod.pom_voucher_no and
    prd.prm_voucher_line = pod.pom_voucher_line   // This is the key
where
  prm.project_id=46 and
  EXTRACT(MONTH FROM prm.request_Date) = 6 and
  EXTRACT(YEAR FROM prm.request_Date) = 2016
order by prm.prm_voucher_no

如果您没有能力控制数据模型,那么我认为最好的方法是人为地添加行号。我完全不建议这样做,因为你已经预先假定了很多事情,最明显的是一个表中的记录顺序会自动与另一个表中的记录顺序相关——我打赌这远远不能保证。
添加行号将使用row_number()分析完成,PostgreSQL有这个功能,但MySQL没有。。。你的问题里有两个标签。你用的是哪种数据库管理系统?
如果无法添加行号,是否可以将项目id添加到purchase_order_details表中?这可能会处理您的问题,除非您可以在一个采购请求/订单中的多行中拥有相同的项目。
在上面的数据中,请求数量(prd.request_quantity = pod.approved_quantity)上的连接修复了您的问题,但我非常确信,当您开始针对真实数据运行它时,这会烧死您。

09-30 17:08
查看更多