我有两个桌子。表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与卖方名称配对。
再次感谢大家的帮助!
答案 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与第二个标识符结合在一起,以创建一种外键。完成此操作后,联接按预期工作。谢谢大家!