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.
Mi consejo sería NO usar NATURAL JOIN. Defina explícitamente sus condiciones de unión para evitar confusiones y "errores ocultos". Aquí está la documentación oficial de Oracle de NATURAL JOIN y más discusión sobre este tema.
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