如何消除左连接中的重复记录?

时间:2016-04-05 07:45:52

标签: sql postgresql

我想创建一个名为saledetailfortax的视图,它将包含13列。它们是saledetaildate,saledetailtime,shopid,productid,unitid,expdate,batchno,mrp,totalprice,qty,looseqty,priceperunit和taxid。

我的查询是:

  CREATE OR REPLACE VIEW saledetailfortax2 AS 
  select sd.saledetaildate, sd.saledetailtime, sd.shopid, sd.productid,
        sd.unitid, sd.expdate, sd.batchno, sd.mrp, sd.totalprice, sd.qty, 
        sd.looseqty, sd.unitprice as priceperunit, ord.taxid 
  from saledetail sd
  left JOIN distinctPriceperunit  ord
      ON  sd.productid = ord.productid
      AND sd.expdate = ord.expdate
      AND sd.batchno = ord.batchno
      AND sd.mrp = ord.mrp
      AND sd.unitprice = ord.priceperunit  
  where sd.saledetaildate >= '2016-04-01'
  order by  sd.saledetaildate , sd.saledetailtime 

问题是当有两个出租车具有相同的产品,expdate,batchno, mrp和unitprice然后有两个记录同样的东西。

在saledetail表中假设一条记录包含相同的productid,expdate,batchno,mrp和unitprice,但是productid在distinctPriceperunit表中有两个tax​​id,那么当left join出现时它会出现两条记录。但只有一个记录显示两个出租车中的任何一个。

那么如何消除重复记录。

查看distinctpriceperunit(所有都是不同的值):

SELECT DISTINCT od.productid,od.unitid,od.priceperunit,od.expdate,od.mrp,od.batchno,od.taxid    来自orderreceivedetail od   ORDER BY od.productid,od.unitid,od.priceperunit,od.expdate,od.mrp,od.batchno,od.taxid;

表saledetail (   saledetailid字符变化(20)NOT NULL,   saledetaildate日期,   没有时区的saledetailtime时间戳,   shopid整数,   产品整数,   数整数,   单位整数,   unitprice数字,   discperc数字,   discamt数字,   到期日,   mrp数字,   mfdate日期,   batchno字符各不相同(50),   总价数字,   isreturned布尔值,   userid整数,   saleid字符各不相同(20),   isloose布尔值,   looseqty整数,   CONSTRAINT saledetail_pkey PRIMARY KEY(saledetailid) )

3 个答案:

答案 0 :(得分:1)

GROUP BY解决方案:

CREATE OR REPLACE VIEW saledetailfortax2 AS 
select sd.saledetaildate, sd.saledetailtime, sd.shopid, sd.productid,
       sd.unitid, sd.expdate, sd.batchno, sd.mrp, sd.totalprice, sd.qty, 
       sd.looseqty, sd.unitprice as priceperunit, MAX(ord.taxid) 
from saledetail sd
left JOIN distinctPriceperunit ord
    ON  sd.productid = ord.productid
    AND sd.expdate = ord.expdate
    AND sd.batchno = ord.batchno
    AND sd.mrp = ord.mrp
    AND sd.unitprice = ord.priceperunit  
where sd.saledetaildate >= '2016-04-01'
group by sd.saledetaildate, sd.saledetailtime, sd.shopid, sd.productid,
         sd.unitid, sd.expdate, sd.batchno, sd.mrp, sd.totalprice, sd.qty, 
         sd.looseqty, sd.unitprice
order by sd.saledetaildate, sd.saledetailtime

相关的子查询解决方案:

CREATE OR REPLACE VIEW saledetailfortax2 AS 
select sd.saledetaildate, sd.saledetailtime, sd.shopid, sd.productid,
       sd.unitid, sd.expdate, sd.batchno, sd.mrp, sd.totalprice, sd.qty, 
       sd.looseqty, sd.unitprice as priceperunit,
       (select max(taxid) from distinctPriceperunit ord
        WHERE sd.productid = ord.productid
          AND sd.expdate = ord.expdate
          AND sd.batchno = ord.batchno
          AND sd.mrp = ord.mrp
          AND sd.unitprice = ord.priceperunit)
from saledetail sd
where sd.saledetaildate >= '2016-04-01'
order by sd.saledetaildate, sd.saledetailtime 

答案 1 :(得分:0)

您可以使用GROUP BY这些列productid,expdate,batchno,mrp和unitprice。

答案 2 :(得分:-1)

使用
    MAX(unitprice)

这将删除您的重复。