2015-11-10 1 views
1

Позвольте мне подробно объяснить вопрос. У меня есть 4 таблицы A, B, C, D. A, B, C - это таблицы, имеющие основные данные, в которых ни одна строка или столбец не равна нулю. Но D - таблица сопоставления с использованием основных таблиц A, B, C, но имеющих нулевые значения в некоторых строках.В Oracle, как присоединиться к двум таблицам, один из указанных столбцов таблицы имеет нулевые значения?

Now I wanted to join the 4 tables and display the output. 

    An Example: 

CREATE TABLE A 
    (aid NUMBER,aval VARCHAR2(1) 
); 
CREATE TABLE B 
    (bid NUMBER,bval VARCHAR2(1) 
); 
CREATE TABLE C 
    (cid NUMBER,cval VARCHAR2(1) 
); 
CREATE TABLE D 
    (
    did NUMBER, 
    aid NUMBER, 
    bid NUMBER, 
    cid NUMBER, 
    CONSTRAINT fk1 FOREIGN KEY (aid) REFERENCES A(aid), 
    CONSTRAINT fk2 FOREIGN KEY (bid) REFERENCES B(bid), 
    CONSTRAINT fk3 FOREIGN KEY (cid) REFERENCES C(cid) 
); 
INSERT INTO A VALUES 
    (1,'s' 
); 
INSERT INTO A VALUES 
    (2,'p' 
); 
INSERT INTO B VALUES 
    (1,'K' 
); 
INSERT INTO B VALUES 
    (2,'L' 
); 
INSERT INTO C VALUES 
    (1,'M' 
); 
INSERT INTO C VALUES 
    (2,'N' 
); 
INSERT INTO D VALUES 
    (1,1,1,1 
); 
INSERT INTO D VALUES 
    (1,2,NULL,NULL 
); 
INSERT INTO D VALUES 
    (1,1,2,NULL 
); 
INSERT INTO D VALUES 
    (1,1,NULL,2 
); 

Теперь я хочу выход быть похожим:

s K  M 
p null null 
s L  null 
s null N 

Я объяснил отредактированный вопрос в комментарии ниже. Точный запрос выглядит следующим образом:

SELECT DISTINCT A.NM, 
    B.NM, 
    G.NM 
FROM w H 
INNER JOIN A 
ON H.id = A.ID 
AND H.FLG ='Y' 
INNER JOIN F 
ON F.ID = H.ID 
AND F.ID =1 
INNER JOIN E 
ON F.ID  = E.ID 
AND E.BYu NOT IN ('7','1') 
AND E.Dex  = 'A' 
LEFT JOIN B 
ON B.ID= E.ID 
LEFT JOIN G 
ON G.ID = E.ID 
ORDER BY 1; 

D таблица в моем первом посте был весь код или выбор в сочетании до левого соединения Б. Этого запрос работает, но я не уверен, что это лучшая практика или не. Я хочу знать, как фильтровать левую таблицу в левом внешнем соединении перед присоединением к таблицам (я не хочу ее фильтровать после использования предложения where, поскольку это снижает производительность). Я также знаю, что правая таблица в левое внешнее соединение фильтруется с помощью «и пункт в присоединиться к себе.

Любая помощь очень высоко ценится.

+0

Вы используете внешние соединения (слева или справа в этом случае)? Что вы пробовали? – xQbert

+0

@xQbert Спасибо за ваш ответ. Думаю, я не мог объяснить свой запрос должным образом, это не так. Я отредактировал свой вопрос. Пожалуйста, проверьте. У меня несколько таблиц, некоторые из которых используют внутреннее соединение и некоторые внешние соединения. Мне хотелось присоединиться к таблицам после фильтрации некоторых строк. Когда я пытаюсь, чтобы записи не попадали в внешние соединения. Но я могу, если я сохраню его во внутреннем соединении. Я хотел знать, что лучше всего подходит в этом случае, а также как фильтровать записи фильтровать записи таблицы E.Пожалуйста, голосуйте за мой вопрос, поскольку я нахожусь в процессе обучения и получения репутации :) – gowthi

+0

Каждый движок базы данных разные и разные версии. Таким образом, каждый движок будет оптимизировать запрос по-разному. Когда размещение критериев фильтрации не влияет на результаты, большинство современных двигателей будут переводить критерии в те места, которые лучше всего подходят для оптимальной производительности; иногда оставляя их там, где клаузулы иногда применяют их к результатам до объединения. Итак: ваш вопрос: «Я хочу знать, как фильтровать левую таблицу в левом внешнем соединении перед присоединением к таблицам». Обычно я делаю это в предложении where и позволяю оптимизировать движок. Я также думаю, что это делает его более читаемым. – xQbert

ответ

2

Это, кажется простым внешним соединением ...

select aval,bval,cval from d 
    left join a on a.aid = d.aid 
    left join b on b.bid = d.bid 
    left join C on c.cid = d.cid 

Может быть, вам нужно прочитать о том, как присоединяется к работе. Вот great article

и запросов с результатами.

enter image description here