为什么SQL结果中会出现重复值
我对加入持怀疑态度。例如,使用示例数据库DVDREANT,此查询:为什么SQL结果中会出现重复值,sql,Sql,我对加入持怀疑态度。例如,使用示例数据库DVDREANT,此查询: SELECT customer.customer_id , first_name , last_name FROM customer INNER JOIN payment ON Customer.customer_id = Payment.customer_id 有些记录重复出现,例如,它出现3次“342 Harold Martino”,如: 你知道为什么像本例中那样重复出现同一条记录3次吗?这种
SELECT customer.customer_id
, first_name
, last_name
FROM customer
INNER JOIN payment ON Customer.customer_id = Payment.customer_id
有些记录重复出现,例如,它出现3次“342 Harold Martino”,如:
你知道为什么像本例中那样重复出现同一条记录3次吗?这种重复意味着付款表中有3条记录,其中customer_id=342?但是这个查询“select*from payment where customer_id=342”返回32条记录。因此,我不能正确理解连接是如何工作的。这方面有很多参考资料,因此简而言之,您的表达用简单的英语表达: 从customer表中获取所有记录 然后,对于每个记录,在
客户Id
字段中获取每个具有相同值的付款记录。
为每个付款记录返回一行,该行与付款记录中每行的客户记录中的所有字段重复。
最后,只返回3列:
表中的customer
列customer\u id
或客户
表之一中的付款
列名字
或客户
表之一中的付款
列姓氏
payment
表中返回任何列。。。(我假设first_name和last_name是customer
表中的字段…)
请记住,交叉联接
(或完全外部联接
)是一种联接,表示从左侧获取所有字段并创建一个与右侧相乘的单行组合,因此对于左侧的每一行,返回左侧行与右侧行的组合。因此,交叉联接中返回的行数是当前表中的行数乘以联接表中的行数
在查询中,内部联接
或左侧内部联接
将生成一个记录集,其中包括当前表结构中的所有字段,还将包括联接表中的字段。
隐式LEFT
组件指定只返回与现有表结构匹配的记录,因此在这种情况下,只返回与当前未筛选的customer
表中的Payment
客户id匹配的记录
结果行数是联接表中与当前表匹配的行数
如果您想查询: 选择所有已付款的客户 然后可以使用联接,但也应该使用
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\u id
字段您只在Customer
中选择列,并且payments
对于给定的客户有重复项。谢谢,但是如果支付表中有32行customerid 342,那么它不应该出现32行重复项而不是3行。“因此我无法正确理解联接是如何工作的。”如果上面的链接没有回答您的问题,那么:显示表customer和表payment中的数据(仅显示与此问题相关的数据),并添加您希望从该数据中得到的结果。
SELECT customer_id
, first_name
, last_name
FROM customer
WHERE EXISTS (SELECT customer_id FROM payment WHERE payment.customer_id = customer.customer_id)