Oracle - Sql - Почему Q3 не возвращает те же результаты, что и Q2? - PullRequest
0 голосов
/ 20 августа 2010
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 ]

2 голосов
/ 20 августа 2010

Поскольку t2.col1 IS NULL и t2.col2 = 44 не будут оба истинными одновременно.

Если t2.col1 IS NULL, это означает, что в соединении не было совпадений, поэтому t2.col2 также будет1007 *.

0 голосов
/ 20 августа 2010

t2.col2 не может быть 44, как проверено в вашем WHERE, если вы не получаете результат от левого соединения для всей этой таблицы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...