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

Posted

技术标签:

【中文标题】如何消除左连接中的重复记录?【英文标题】:How to eliminate duplicate record in left join? 【发布时间】:2016-07-25 00:36:50 【问题描述】:

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

我的查询是:

  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 

问题是当有两个具有相同 productid 、 expdate 、 batchno 的taxid 时, mrp 和 unitprice 那么有两条记录带有相同的东西。

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

那么如何消除重复记录。

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

选择 DISTINCT od.productid、od.unitid、od.priceperunit、od.expdate、od.mrp、od.batchno、od.taxid FROM orderreceivedetail od 按 od.productid、od.unitid、od.priceperunit、od.expdate、od.mrp、od.batchno、od.taxid 订购;

表销售详情 ( saledetailid 字符变化(20)NOT NULL, 销售详情日期, saledetailtime 没有时区的时间戳, shopid 整数, 产品整数, 数量整数, unitid 整数, 单价数字, 离散数字, 离散数字, 延长日期, mrp 数字, mfdate 日期, 批次无字符变化(50), 总价格数字, 返回布尔值, 用户 ID 整数, saleid 字符变化(20), isloose 布尔值, 松散的整数, CONSTRAINT saledetail_pkey PRIMARY KEY (saledetailid) )

【问题讨论】:

能否请您格式化查询以使其更具可读性。此外,您能否提供表格的定义。 选择列表中的 GROUP BY 或相关子查询。 【参考方案1】:

使用 MAX(单价)

这将删除你的重复。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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 

【讨论】:

@Sagi,花了一些时间打字。 我收回了:) 它对我有用,相关子查询解决方案。谢谢jarlh @jarlh 我有一个疑问,在我的想法中,当我们离开时加入另一个表,然后左表显示满足条件的记录。但是为什么这里的记录比左表多。 @Avinash,即使不满足条件,左连接也会从左表返回行。这个相关的子查询永远不会返回比左连接版本更多的行。它只能返回更少的行!

以上是关于如何消除左连接中的重复记录?的主要内容,如果未能解决你的问题,请参考以下文章

说说左连接出现重复记录的问题

sql查询消除重复记录

mysql开发之join语句学习

mysql怎么去除重复数据

如何在SQL Server中消除重复和合并列值到单个文本

连接多个表后如何从sql查询结果中删除重复记录