Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL结果中会出现重复值_Sql - Fatal编程技术网

为什么SQL结果中会出现重复值

为什么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次吗?这种

我对加入持怀疑态度。例如,使用示例数据库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次吗?这种重复意味着付款表中有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)