我对加入有疑问。例如,使用示例数据库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?但是,此查询“从customer_id = 342的付款中选择* *”返回32条记录。因此,我无法正确理解联接的工作方式。
与此相关的资源很多,因此简而言之,您的表情用简单的英语来表达:
从客户表中获取所有记录,然后为每个记录获取customer_Id
字段中具有相同值的每个付款记录。为每个付款记录返回一行,该行复制客户记录中付款记录中每一行的所有字段。最后,仅返回3列:
customer_id
列customer
first_name
是在的一列customer
或payment
表last_name
是在的一列customer
或payment
表请注意,我们没有从
payment
表中带回任何列...(我假设first_name和last_name是customer
表中的字段...)
请记住,CROSS JOIN
(或a FULL OUTER JOIN
)是一个联接,表示从左侧获取所有字段并创建一个与右侧相乘的单行组合,因此对于左侧的每一行,请返回左侧行的组合每行都在右边。因此,a中返回的行CROSS JOIN
数是当前表中的行数乘以联接表中的行数。
在查询中,INNER JOIN
或LEFT INNER JOIN
将产生一个记录集,其中包括当前表结构中的所有字段,并且还将包括联接表中的字段。在隐 LEFT
组件规定,只有符合现有的表结构的记录应返回,所以在这种情况下,仅Payment
记录了那场比赛一customer_id
在当前没有过滤customer
表将被退回。
结果行数是联接表中在当前表中具有匹配项的行数。
相反,如果要查询:
选择所有有付款的客户
那么您可以使用联接,但还应该使用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
领域
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句