2010-08-20 171 views
0
DROP TABLE table1; 
DROP TABLE table2; 

CREATE TABLE table1 
( col1 NUMBER, 
    col2 NUMBER, 
    col3 NUMBER, 
    col4 NUMBER 
); 

CREATE TABLE table2 
( col1 NUMBER, 
    col2 NUMBER, 
    col3 NUMBER, 
    col4 NUMBER 
); 

INSERT INTO TABLE1 VALUES (1,44,1,1); 
INSERT INTO table1 VALUES (2,44,2,2); 
INSERT INTO TABLE1 VALUES (3,44,3,3); 

INSERT INTO table2 VALUES (1,44,11,11); 
INSERT INTO TABLE2 VALUES (2,44,22,22); 

-- Q1 
SELECT t1.*, t2.* FROM table1 t1, table2 t2 
WHERE t1.col1 = t2.col1(+); 

-- Yields 
-- col1 col2 col3 col4 col1_1 col2_1 col3_1 col4_1 
     1 44 1 1  1  44  11  11 
     2 44 2 2  2  44  22  22 
     3 44 3 3  NULL NULL NULL NULL 


-- Q2 
SELECT t1.*, t2.* FROM table1 t1, table2 t2 
WHERE t1.col1 = t2.col1(+) 
AND    t2.col1 IS NULL; 

-- Yields 
-- col1 col2 col3 col4 col1_1 col2_1 col3_1 col4_1 
     3 44 3 3 NULL  NULL NULL NULL 


-- Q3 
SELECT t1.*, t2.* FROM table1 t1, table2 t2 
WHERE t1.col2 = 44 
    AND t2.col2 = 44 
    AND t1.col1 = t2.col1(+) 
    AND   t2.col1 IS NULL; 

-- Yields 
-- col1 col2 col3 col4 col1_1 col2_1 col3_1 col4_1 

-- No Rows. 

COMMIT; 

回答

2

因为t2.col1 IS NULLt2.col2 = 44不会同时成立。

如果t2.col1 IS NULL,表示加入时没有匹配,所以t2.col2也将是NULL

+0

Doh'现在很明显。这也解释了为什么要将筛选器拆分为with子句,并且只在结果查询中进行连接才能解决问题。 谢谢红色 – EvilTeach 2010-08-20 18:53:10

0

t2.col2不可能是44,如果您没有从整个表的左连接返回结果,那么您的WHERE中将检查!

相关问题