Oracle Natural Joins和Count(1)
时间:2020-03-06 14:26:45 来源:igfitidea点击:
有谁知道为什么在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时,这成为了问题。
解决方案
如果它确实按照我们所说的发生,那么它一定是一个优化错误,我们应该将其报告给Oracle。
你应该尝试计数(*)
两者之间是有区别的。
count(1)表示计数行,其中1不为空
count(*)表示对行进行计数
刚刚注意到我们使用了2个自然联接...
从文档中,我们只能在2个表上使用自然联接
自然加入
我的建议是不要使用NATURAL JOIN。明确定义加入条件,以避免混淆和"隐藏的错误"。这是Oracle的NATURAL JOIN官方文档,以及有关此主题的更多讨论。