for x in (select * from customers)
loop
-- check if x.customer_id exists in order_details table.
---if yes
--output the customer tables row
-- else
--ignore
end if;
end loop;
for x in (select * from customers)
loop
--for each row in customer
-- fetch records from order_details which match this condition
select * from order_details where customer_id=x.customerid
end loop;
3条答案
按热度按时间dly7yett1#
exists的逻辑工作如下
因此,在exists查询中,计划通常会使用嵌套循环(但不是硬性的快速规则)
join查询的逻辑等价性如下
y53ybaqx2#
EXISTS()
称为“半连接”。它开始了一个JOIN
,但在找到第一个匹配项时停止。因此,EXISTS
会比任何同类产品都快JOIN
.也,
EXISTS( SELECT * ... WHERE ... )
并不真正关心*
. 它将使用任何最佳索引来发现匹配WHERE
,则返回1或0(表示“true”或“false”)。当然,如果
LEFT JOIN
将返回0或1行,不再返回更多行,则没有太多性能差异。除了LEFT JOIN
将从表中返回值。lf5gs5x23#
带着一个
EXISTS
子句选择至少存在一个订单明细记录的所有客户。加入后,您将再次选择这些客户。但是,只要存在订单详细信息,您就可以经常选择它们。i、 你会有很多复制品。
可以使用删除结果中的重复项
DISTINCT
为了让每个客户都能再次得到:但是为什么要生成所有的副本而只需要再次删除它们呢?别这样。只有当你真的想要加入结果时才加入。
另一种选择,我认为它比
EXISTS
子句是IN
顺便说一句。这将是我编写查询的方式: