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

Why is INNER JOIN producing more records than original file?

我有两张桌子。 Table A & Table B。Table A 有 40516 行,按 seller_id 记录销售额。 Table A 中的第一列是每次销售时都会重复的 seller_id。

示例:Table A(40516 行)

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

seller_id也出现在TableB中,也包含相应的卖家名称。

示例:Table B(5851 行)

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

我想连接这两个表,但只显示来自 Table B 的卖家名称和来自 Table 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

我希望结果在 Table A 中包含相同数量的行。相反,我将名称匹配起来并增加 348 行...

更新:

我把问题里的"unique_id"改成了"seller_id"。

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

再次感谢大家的帮助!

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

运行 此查询查找重复项:

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.

因为唯一 ID 列是不唯一

Gordon Linoff 是正确的。 seller_id(以前列为 unique_id)确实在整个数据集中重复出现。我愚蠢地假设不是这样。 seller_name 也有很多重复项!最后,我不得不使用 CONCAT() 函数将 seller_id 与第二个标识符连接起来,以创建一种外键。在我这样做之后,连接按预期工作。谢谢大家!