内连接生产笛卡尔积

问题描述 投票:0回答:1

通过查看下面的2个查询,我假设它们将返回相同的结果集,但相距甚远。为什么带有内部联接的2查询产生这么多记录?我究竟做错了什么?我一直盯着这个看了太久,需要一双新鲜的眼睛才能看到它。

SELECT COUNT(*)  
FROM ZCQ Z
WHERE Z.QUOTE_CUSTOMER_ID IN (SELECT CUSTOMER_ID FROM CUST_ORDER)
-- returned 6,646 RECS

SELECT COUNT(*) 
FROM ZCQ Z
INNER JOIN CUST_ORDER CO ON zquote_customer_id = co.customer_id
-- returned 4,232,473 RECS

请注意,这些是Oracle 10g表,但DBA没有设置FK或PK。

sql oracle10g inner-join
1个回答
1
投票

不,这些通常不会返回相同的结果。

  • 第一个计数ZCQ中与CUST_ORDER中的客户匹配的行数。

  • 秒数统计匹配的行总数。如果CUST_ORDER中有重复的客户,那么将计算所有重复的客户。

可以使用以下方法获得相同的结果:

SELECT COUNT(DISTINCT z.zquote_customer_id) 
FROM ZCQ Z JOIN
     CUST_ORDER CO
     ON zquote_customer_id = co.customer_id;

但是INEXISTS可能比删除重复项[[after做比赛更有效。

© www.soinside.com 2019 - 2024. All rights reserved.