4

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

4 に答える 4

9

私のアドバイスは、NATURAL JOIN を使用しないことです。混乱や「隠れたバグ」を避けるために、結合条件を明示的に定義します。これは、公式の NATURAL JOIN Oracle ドキュメントと、この件に関する詳細な説明です。

于 2008-09-19T17:34:52.977 に答える
2

あなたが言ったとおりに発生する場合は、オプティマイザのバグに違いないので、Oracle に報告する必要があります。

于 2008-09-19T16:28:44.477 に答える
1

count(*)を試してみてください

2つの間に違いがあります。
count(1)は、1がnullではない行のカウントを意味します
count(*)は、行のカウントを意味します

于 2008-09-19T16:31:26.687 に答える
1

2 つの自然結合を使用していることに気付きました...ドキュメントから、2 つのテーブルに対してのみ自然結合を使用できます Natural_Join

于 2008-09-19T17:12:33.623 に答える