Oracle Natural连接和计数(1)

时间:2008-09-19 16:19:52

标签: oracle natural-join

有没有人知道为什么在Oracle 11g中当你使用多个自然连接执行Count(1)时它会进行笛卡尔连接并将计数方式抛出?

SELECT Count(1) FROM record NATURAL join address NATURAL join person WHERE status=1
AND code = 1 AND state = 'TN'

这会在

时拉回300万行
SELECT * FROM record NATURAL join address NATURAL join person WHERE status=1
AND code = 1 AND state = 'TN'

拉回36000行,这是正确的数量。

我只是错过了什么?

以下是我用来获得此结果的表格。

CREATE TABLE addresses (
address_id           NUMBER(10,0)  NOT NULL,
address_1            VARCHAR2(60)  NULL,
address_2            VARCHAR2(60)  NULL,
city                 VARCHAR2(35)  NULL,
state                CHAR(2)       NULL,
zip                  VARCHAR2(5)   NULL,
zip_4                VARCHAR2(4)   NULL,
county               VARCHAR2(35)  NULL,
phone                VARCHAR2(11)  NULL,
fax                  VARCHAR2(11)  NULL,
origin_network       NUMBER(3,0)   NOT NULL,
owner_network        NUMBER(3,0)   NOT NULL,
corrected_address_id NUMBER(10,0)  NULL,
"HASH"                 VARCHAR2(200) NULL
);

CREATE TABLE rates (
rate_id      NUMBER(10,0) NOT NULL,
eob          VARCHAR2(30) NOT NULL,
network_code NUMBER(3,0)  NOT NULL,
product_code VARCHAR2(2)  NOT NULL,
rate_type    NUMBER(1,0)  NOT NULL
);

CREATE TABLE records (
pk_unique_id      NUMBER(10,0) NOT NULL,
rate_id           NUMBER(10,0) NOT NULL,
address_id        NUMBER(10,0) NOT NULL,
effective_date    DATE         NOT NULL,
term_date         DATE         NULL,
last_update       DATE         NULL,
status            CHAR(1)      NOT NULL,
network_unique_id VARCHAR2(20) NULL,
rate_id_2         NUMBER(10,0) NULL,
contracted_by     VARCHAR2(50) NULL,
contract_version  VARCHAR2(5)  NULL,
bill_address_id   NUMBER(10,0) NULL
);

我应该提到这在Oracle 9i中不是问题,但是当我们切换到11g时它就成了一个问题。

4 个答案:

答案 0 :(得分:9)

我的建议是不要使用NATURAL JOIN。明确定义您的连接条件以避免混淆和“隐藏的错误”。以下是关于此主题的official NATURAL JOIN Oracle documentationmore discussion

答案 1 :(得分:2)

如果它与您说的完全相同,那么必须是一个优化错误,您应该将其报告给Oracle。

答案 2 :(得分:1)

你应该尝试计数(*)

两者之间存在差异 count(1)表示计数行,其中1不为空 count(*)表示计数行

答案 3 :(得分:1)

刚刚注意到你使用了2个自然连接...... 从文档中,您只能在2个表上使用自然连接 Natural_Join