Mysql 联接查询返回重复的行 采购申请书 采购申请详情 采购订单主文件 采购订单详情

Mysql 联接查询返回重复的行 采购申请书 采购申请详情 采购订单主文件 采购订单详情,mysql,sql,postgresql,join,inner-join,Mysql,Sql,Postgresql,Join,Inner Join,当我运行下面的查询时,它给出了14行(返回重复行)。预期输出行是6。。请参考以下输出表 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 purcha

当我运行下面的查询时,它给出了14行(返回重复行)。预期输出行是6。。请参考以下输出表

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、group by、临时表和with子句所有这些方法。。但没有任何用处,这会产生重复的行

如何解决这个问题

输出 预期产量
我认为问题在于数据模型本身。理想情况下,在两个“详细信息”表中都会有一个
行号
字段,这将用于连接:

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添加到
采购订单详细信息
表中?这可能会处理您的问题,除非您可以在采购申请/订单中的多行上有相同的项目


在您上面的数据中,加入请求数量(
prd.request\u quantity=pod.approved\u quantity
)可以解决您的问题,但我很有信心,当您开始对真实数据运行它时,这会烧死您。

不要标记未涉及的产品。这是因为您在
采购申请详情
采购订单详情
中多次拥有相同的凭证编号,您得到了您想要的,所以除非你解释你想要什么,否则我们真的帮不了你。在您为17号prm_凭证编写的预期输出中,您有2个项目id。但在您得到的内容中,您有4个项目id。所以这就是为什么你会得到两倍多的行。我想加入这四个表。从第一个表(采购申请主表)prm\U凭证号、项目id、状态id第二个表(采购申请明细)项目id、申请数量第三个表(采购订单主表)pom\U凭证号、供应商id第四个表(采购订单明细)批准的\U数量、费率条件**项目id=46和(摘录(从申请日期算起的月份)=6)和(摘录(从申请日期算起的年份)=2016)**我可以告诉你,你得到了你想要的东西。对于每一行有不同的值,如项目id,但相同的prm\U凭证编号,你会得到一个重复的行,每个项目id一个。所以问题在于你期望什么,而不是你得到什么。我建议删除“where”和“分组方式”因此,您将看到所有结果,然后一次添加每个需求1,并查看您希望删除的重复行未删除的位置,然后比较它们并查看差异所在。行之间的每个差异将创建另一行…问题已解决..prd.item_id=pod.item_id也加入了这些字段..tq@Hambone
pom_voucher_no| approved_quantity|  rate                            
16                     50           1000                            
16                     100          1500                            
17                     75           150                         
18                     10           2500                            
18                     35           3000                            
18                     120          1700                            
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 
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    
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