2008-09-19 52 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