为什么INNER JOIN产生的记录多于原始文件?

时间:2019-06-14 13:10:08

标签: sql postgresql csv inner-join postgresql-11

我有两个桌子。表A和表B。表A有40516行,并按Seller_id记录销售。表A中的第一列是Seller_id,每次销售都会重复一次。

示例:表A(40516行)

seller_id | item | cost
------------------------
   1      | dog  | 5000
   1      | cat  | 50
   4      |lizard| 80
   5      |bird  | 20
   5      |fish  | 90

seller_id也出现在表B中,并且还包含相应的卖方名称。

示例:表B(5851行)

seller_id | seller_name
-------------------------
   1      | Dog and Cat World INC
   4      | Reptile Love.com
   5      | Ocean Dogs Inc

我想联接这两个表,但仅显示表B中的卖方名称和表A中的所有其他列。当我使用INNER JOIN进行操作时,将获得40864行(额外的348行)。查询不应该只产生原始的40516行吗?

还不确定这是否重要,但是Seller_id可以在数字前包含几个零(例如0000845、0000549)。

我在这里四处张望,还没有真正找到答案。我已经尝试过LEFT和RIGHT联接,并且一个获得相同的结果,而另一个获得更多的结果。

SQL代码示例:

SELECT public.table_B.seller_name, *
FROM public.table_A
INNER JOIN public.table_B ON public.table_A.seller_id = 
public.table_B.seller_id;

预期结果:

seller_name           | seller_id | item | cost
------------------------------------------------
Dog and Cat World INC |    1      | dog  | 5000
Dog and Cat World INC |    1      | cat  | 50
Reptile Love.com      |    4      |lizard| 80
Ocean Dogs Inc        |    5      |bird  | 20
Ocean Dogs Inc        |    5      |fish  | 90

我希望结果在表A中包含相同数量的行。相反,我保留了匹配的名称和另外348行...

更新:

我在问题中将“ unique_id”更改为“ seller_id”。

我想我应该在原始示例中为unique_id选择一个更好的名称。我并不是说它在钥匙意义上是独一无二的。每次销售都有重复的只是卖方的ID(在表A中)。卖方的ID 确实在表A中重复,因为应该这样做。我只想将卖方ID与卖方名称配对。

再次感谢大家的帮助!

3 个答案:

答案 0 :(得分:1)

unique_id在第一个表中已经没有正确命名,因此也没有理由假定它在第二个表中也是唯一的。

运行此查询以查找重复项:

select unique_id
from table_b
group by unique_id
having count(*) > 1;

您可以使用distinct on来修改查询:

SELECT b.seller_name, a.*
FROM public.table_A a JOIN
     (SELECT DISTINCT ON (b.unique_id) b.*
      FROM public.table_B b
      ORDER BY b.unique_id
     ) b
     ON a.unique_id = b.unique_id;

在这种情况下,如果没有匹配项,您可能会得到更少条记录。要解决此问题,请使用LEFT JOIN

答案 1 :(得分:0)

因为唯一ID 列不是不唯一

答案 2 :(得分:0)

Gordon Linoff是正确的。实际上,在整个数据集中重复了Seller_id(以前列为unique_id)。我愚蠢地假设不是。而且Seller_name也有很多重复项!最后,我必须使用CONCAT()函数将Seller_id与第二个标识符结合在一起,以创建一种外键。完成此操作后,联接按预期工作。谢谢大家!