2008-09-19 51 views
4

有谁知道为什么在Oracle 11g中,当您执行Count(1)时,多于一个自然联接会执行笛卡尔联接并抛出Count方式?Oracle自然联接和计数(1)

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

这拉回样3万行当

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时,它成了一个问题。

+0

描述这些表格。如果明确指定内部连接,你会得到相同的结果吗? – Apocalisp 2008-09-19 16:27:52

回答

1

如果发生的情况完全如您所说那么必须是一个优化器错误,您应该将其报告给Oracle。 (*)

1

你应该尝试一个计数(*)

这两者之间是有区别的。
计数(1)表示计数行,其中1不为空
COUNT(*)表示计算行数

+1

由于1不会为空,因此潜在结果没有差异。 – 2008-09-22 09:24:03

+2

...并且无论如何count(1)被重写为计数(*)。 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156159920245 – 2009-03-29 00:35:35

1

只注意到你用了2自然连接... 从文档只能使用自然连接上2表 Natural_Join

+0

这是不正确的(和你引用的网站不是文档,它是一个独立的Wiki ): 请参阅http://68.142.116.68/docs/cd/B19306_01/server.102/b14200/statements_10002.htm#sthref9834 – 2008-09-22 09:22:21