Sql 产生笛卡尔积的内连接

Sql 产生笛卡尔积的内连接,sql,oracle10g,inner-join,Sql,Oracle10g,Inner Join,查看下面的两个查询,我假设它们将返回相同的结果集,但它们相差很远。为什么带有内部联接的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_OR

查看下面的两个查询,我假设它们将返回相同的结果集,但它们相差很远。为什么带有内部联接的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。

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

  • 第一个统计
    ZCQ
    中与
    CUST\u ORDER
    中的客户匹配的行数

  • 第二个计算匹配行的总数。如果
    客户订单中有重复客户
    ,则将统计所有重复客户

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

SELECT COUNT(DISTINCT z.zquote_customer_id) 
FROM ZCQ Z JOIN
     CUST_ORDER CO
     ON zquote_customer_id = co.customer_id;
但是中的
存在
可能比匹配后删除重复项更有效