Сервер SQL / Oracle, полное внешнее соединение и 3 или более таблиц - PullRequest
0 голосов
/ 05 января 2010

У меня маленькая проблема.

Я использую полное внешнее соединение на сервере Sql - пока все работает но теперь я добавляю таблицу, и она не работает должным образом.

Вот мой код:

SELECT *
FROM Table1 h , (db1..Table2 s FULL OUTER JOIN  db1..Table3 k
on k.attributT3_1 = s.attributT2_1 
    and left(k.attributT3_2,4) = year(s.attributT2_2)
    and substring(k.attributT3_2,6,1) = s.attributT2_2
    and (case when k.attributT3_3 = 0 and k.attributT3_4 = 11 then 10 
        when k.attributT3_3 = 0 and k.attributT3_4 = 14 then 40
        when k.attributT3_3 = 0 and k.attributT3_4 = 16 then 60 
        when k.attributT3_3 = 0 and k.attributT3_4 = 90 then 10 
        when k.attributT3_3 = 1 and k.attributT3_4 = 11 then 11 
        when k.attributT3_3 = 2 and k.attributT3_4 = 11 then 12 
        when k.attributT3_3 = 4 and k.attributT3_4 = 11 then 14 
        when k.attributT3_3 = 7 and k.attributT3_4 = 11 then 17 
        else k.attributT3_3 end) = s.attributT2_3) 
where h.attributT1_1 = k.attributT3_1 
and s.attributT3_1 = '  260585'
and h.attributT1_2 = 055

Это мой SQL, может немного запутать ^^

Моя проблема здесь в том, что FULL OUTER JOIN не работает, потому что я добавил Table1, потому что мне нужна некоторая информация, и теперь FULL OUTER JOIN работает как LEFT OUTER JOIN.

Также возможно, что мне нужно добавить одну или две таблицы в этом ПОЛНОМ НАЪЕМЕ.

У кого-нибудь есть идеи, как мне заставить его работать? (и да, я знаю, что мог бы использовать 2 левых внешних соединения и объединение и заставить его работать, но это не то, что я хочу сделать)

Кстати, скрипт также может работать на Oracle: D

вывод должен быть таким: http://img402.imageshack.us/img402/4618/bildwq.jpg

Столбец1 = Таблица1 Столбец2 = Таблица2 Столбец3 = Таблица3

нулевые значения не существуют в таблице

мой скрипт делает то же самое, за исключением того, что вы не можете видеть строки в столбце 2 с нулями

1 Ответ

1 голос
/ 05 января 2010

Предложение WHERE ограничивает результаты, которые могут быть возвращены:

where h.attributT1_1 = k.attributT3_1 
and s.attributT3_1 = '  260585'
and h.attributT1_2 = 055

Это означает, что будут показаны только результаты, в которых таблицы H, K и S внесли строку (не нули). Фактически вы удалили ВНЕШНИЙ из соединения. Попробуйте переместить эти условия в определения соединений.

Пример, показывающий, что я имею в виду:

SQL> create table t1 (id integer, text varchar2(10));
SQL> create table t2 (id integer, text varchar2(10));
SQL> insert into t1 values (1, 'text');
SQL> insert into t1 values (2, 'text');
SQL> insert into t2 values (2, 'text');
SQL> insert into t2 values (3, 'text');
SQL> commit;

Полное внешнее соединение:

SQL> select * from t1 full outer join t2 on t1.id = t2.id;

        ID TEXT               ID TEXT
---------- ---------- ---------- ----------
         2 text                2 text
                               3 text
         1 text

Теперь с фильтрами в предложении WHERE (обратите внимание, что 2 записи исчезают так же, как если бы не было «полного внешнего»):

  1* select * from t1 full outer join t2 on t1.id = t2.id
  2* where t1.text='text'
  3  and t2.text='text';

        ID TEXT               ID TEXT
---------- ---------- ---------- ----------
         2 text                2 text

Теперь с фильтрами, перемещенными в объединение:

SQL> select * from t1 full outer join t2 on t1.id = t2.id
  2                                      and t1.text='text'
  3                                      and t2.text='text';

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