为啥 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 条记录。所以我没有正确理解连接是如何工作的。
【问题讨论】:
您只从customer
和payments
中选择了给定客户的重复列。
谢谢,但是如果支付表中有 32 行的 customerid 为 342,那么它不应该出现 32 行而不是 3 行吗?
“所以我没有正确理解连接是如何工作的。” ***.com/questions/38549/…
如果上面的链接没有回答您的问题,那么:显示您在餐桌客户和餐桌付款中的数据(仅与此问题相关的数据)并添加您的期望来自该数据的结果。
【参考方案1】:
这方面有很多资源,所以简而言之,你的表达用简单的英语说:
从客户表中获取所有记录
然后对于这些记录中的每一个,获取在customer_Id
字段中具有相同值的每个付款记录。
为每个付款记录返回一行,该记录复制付款记录中每一行的客户记录中的所有字段。
最后,只返回 3 列:
customer
表中的 customer_id
列
first_name
列位于 customer
或 payment
表之一中
last_name
列位于 customer
或 payment
表之一中
请注意,我们没有从
payment
表中带回任何列...(我假设 first_name 和 last_name 是customer
表中的字段...)
请记住,CROSS JOIN
(或FULL OUTER JOIN
)是一个连接,它表示从左侧获取所有字段并创建一个与右侧相乘的单行组合,因此对于left,返回左侧行与右侧每一行的组合。所以CROSS JOIN
中返回的行数就是当前表的行数乘以joined表的行数。
在您的查询中,INNER JOIN
或 LEFT 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条。