如何消除左连接中的重复记录?
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,即使不满足条件,左连接也会从左表返回行。这个相关的子查询永远不会返回比左连接版本更多的行。它只能返回更少的行!以上是关于如何消除左连接中的重复记录?的主要内容,如果未能解决你的问题,请参考以下文章