Oracle Natural Joins and Count(1)
Кто-нибудь знает, почему в Oracle 11g, когда вы выполняете Count(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, это стало проблемой.
4 ответа
Мой совет будет НЕ использовать ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ. Четко определите ваши условия соединения, чтобы избежать путаницы и "скрытых ошибок". Вот официальная документация Oracle NATURAL JOIN и более подробное обсуждение этой темы.
Если это происходит именно так, как вы говорите, то это должно быть ошибкой оптимизатора, вы должны сообщить об этом в Oracle.
Вы должны попробовать считать (*)
Между ними есть разница.
count (1) обозначает количество строк, где 1 не нуль
count(*) означает считать строки
Только что заметил, что вы использовали 2 естественных объединения... Из документации вы можете использовать только естественное объединение для 2 таблиц Natural_Join