为啥 SQL 结果中会出现重复值

Posted

技术标签:

【中文标题】为啥 SQL 结果中会出现重复值【英文标题】:Why do repeated values appear in SQL results为什么 SQL 结果中会出现重复值 【发布时间】:2020-03-23 21:01:47 【问题描述】:

我对连接有疑问。例如,使用示例数据库 dvdrental,此查询:

SELECT customer.customer_id
       , first_name
       , last_name
FROM customer 
INNER JOIN payment ON Customer.customer_id = Payment.customer_id

有些记录出现重复,例如出现 3 次“342 Harold Martino”,如:

342   Harold   Martino

342   Harold   Martino

342   Harold   Martino

你知道为什么会出现重复记录,就像这个例子中出现相同的记录 3 次吗?这个重复意味着支付表中有3条记录customer_id = 342?但是这个查询“select * from payment where customer_id = 342”返回 32 条记录。所以我没有正确理解连接是如何工作的。

【问题讨论】:

您只从customerpayments 中选择了给定客户的重复列。 谢谢,但是如果支付表中有 32 行的 customerid 为 342,那么它不应该出现 32 行而不是 3 行吗? “所以我没有正确理解连接是如何工作的。” ***.com/questions/38549/… 如果上面的链接没有回答您的问题,那么:显示您在餐桌客户和餐桌付款中的数据(仅与此问题相关的数据)并添加您的期望来自该数据的结果。 【参考方案1】:

这方面有很多资源,所以简而言之,你的表达用简单的英语说:

从客户表中获取所有记录 然后对于这些记录中的每一个,获取在customer_Id 字段中具有相同值的每个付款记录。 为每个付款记录返回一行,该记录复制付款记录中每一行的客户记录中的所有字段。 最后,只返回 3 列:

customer 表中的 customer_idfirst_name 列位于 customerpayment 表之一中 last_name 列位于 customerpayment 表之一中

请注意,我们没有从 payment 表中带回任何列...(我假设 first_name 和 last_name 是 customer 表中的字段...)

请记住,CROSS JOIN(或FULL OUTER JOIN)是一个连接,它表示从左侧获取所有字段并创建一个与右侧相乘的单行组合,因此对于left,返回左侧行与右侧每一行的组合。所以CROSS JOIN中返回的行数就是当前表的行数乘以joined表的行数。

在您的查询中,INNER JOINLEFT INNER JOIN 将生成一个记录集,其中包含 current 表结构中的所有字段,并将包含 joined 中的字段表也​​是。 implicit LEFT 组件指定只返回与现有表结构匹配的记录,因此在这种情况下,只有在当前 notcustomer_id 的 Payment 记录/em> 过滤后的customer 表将被返回。

结果行数是joined表中与当前表匹配的行数。


如果你想查询:

选择所有已付款的客户

那么你可以使用连接,但你也应该使用DISTINCT 子句,只返回唯一的记录:

SELECT DISTINCT customer.customer_id
       , first_name
       , last_name
FROM customer 
INNER JOIN payment ON Customer.customer_id = Payment.customer_id

另一种方法是使用子查询而不是连接:

SELECT customer_id
       , first_name
       , last_name
FROM customer 
WHERE EXISTS (SELECT customer_id FROM payment WHERE payment.customer_id = customer.customer_id)

关于何时使用一种查询样式而不是另一种查询的规则非常复杂,并且非常依赖于每个表中的行数、可用索引的类型,甚至是您正在操作的 RDBMS 的类型或版本之内。

要进行优化,请运行两个查询,比较结果和时间,然后使用更适合您的数据库的查询。如果以后的性能成为问题,请尝试另一个 :)

选择Customer_id 字段

【讨论】:

以上是关于为啥 SQL 结果中会出现重复值的主要内容,如果未能解决你的问题,请参考以下文章

为啥我sql语句用group by老查出两条连续相同的记录?比如本来3条结果,会出现6条。

为啥PostgreSQL UUID-OSSP可能产生重复值

SQL中如何统计查询结果中某一列重复值的个数?

多表查询结果出现重复记录,根据条件只取其中的一条记录的sql语句

为啥 Eclipse 中会出现重复的方法建议?

SQL IN 语句 - 返回结果时保持重复