natural left inner oracle natural-join

left - Oracle Natural Joins and Count(1)



tsql join (4)

¿Alguien sabe por qué en Oracle 11g cuando haces un conteo (1) con más de una unión natural, hace una combinación cartesiana y elimina el conteo?

Como

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

Esto tira hacia atrás como 3 millones de filas cuando

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

tira hacia atrás como 36000 filas, que es la cantidad correcta.

¿Me estoy perdiendo algo?

Aquí están las tablas que estoy usando para obtener este resultado.

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 );

Debo mencionar que esto no fue un problema en Oracle 9i, pero cuando cambiamos a 11g se convirtió en un problema.



Si sucede exactamente como usted dice, entonces debe ser un error del optimizador, debe informarlo a Oracle.


Solo notó que usó 2 combinaciones naturales ... De la documentación solo puede usar una combinación natural en 2 tablas Natural_Join


deberías intentar un conteo (*)

Hay una diferencia entre los dos.
count (1) significa contar filas donde 1 no es nulo
count (*) significa contar las filas