一个表的内部联接并防止重复?

时间:2018-11-14 17:25:02

标签: mysql sql

我有一个名为

的表

使用以下列进行交易(已删除大量冗余数据)

trade_id,buyer_company_code,seller_company_code,legacy_trade_number。

我打算查询所有交易,其中某笔交易的Buyer_company_code =另一笔交易的Seller_company_code,而该笔交易的Seller_company_code =另一笔买方的Buyer_company Code

我尝试了查询,结果显示在下面的屏幕截图中

select * from trade tradetable1 inner join trade tradetable2
 on tradetable1.seller_company_code=tradetable2.buyer_company_code and tradetable1.buyer_company_code=tradetable2.seller_company_code
    and tradetable1.legacy_trade_number<tradetable2.legacy_trade_number

enter image description here

目前,它为我提供了以下内容(一项交易的legacy_trade_number)和(另一项交易的legacy_trade_numbe)具有重复项(由于笛卡尔积)

5548 5554
5548 5555
5548 5556
5549 5554
5549 5555
5549 5556
5550 5554
5550 5555
5550 5556

但我要求它如下

5548 5554
5549 5555
5550 5556

其中两列没有重复值。任何建议/提示都会有所帮助!谢谢

1 个答案:

答案 0 :(得分:3)

如果您不想为legacy_trade_number列重复结果,则应该选择select真正需要的列,而不是select *

select distinct tradetable1.legacy_trade_number from (
    select * from trade 
) tradetable1 
inner join ( 
select * 
from trade ) tradetable2 on tradetable1.seller_company_code=tradetable2.buyer_company_code 
    and tradetable1.buyer_company_code=tradetable2.seller_company_code
    and tradetable1.legacy_trade_number<tradetable2.legacy_trade_number

使用

可以简单地获得结果
select disticnt t1.legacy_trade_number 
from  trade  t1 
inner join trade t2 on on t1.seller_company_code=t2.buyer_company_code 
    and t1.buyer_company_code=t2.seller_company_code
    and t1.legacy_trade_number<t2.legacy_trade_number

在行级别评估重复项,因此..如果需要其他列,则应选择所需的值,并使用聚集函数来减少无用的值

例如:使用聚合函数作为min()可以

select t1.legacy_trade_number, min(t1.col1), min(t2.coln)
from  trade  t1 
inner join trade t2 on on t1.seller_company_code=t2.buyer_company_code 
    and t1.buyer_company_code=t2.seller_company_code
    and t1.legacy_trade_number<t2.legacy_trade_number
  group by t1.legacy_trade_number