Позвольте мне подробно объяснить вопрос. У меня есть 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, поскольку это снижает производительность). Я также знаю, что правая таблица в левое внешнее соединение фильтруется с помощью «и пункт в присоединиться к себе.
Любая помощь очень высоко ценится.
Вы используете внешние соединения (слева или справа в этом случае)? Что вы пробовали? – xQbert
@xQbert Спасибо за ваш ответ. Думаю, я не мог объяснить свой запрос должным образом, это не так. Я отредактировал свой вопрос. Пожалуйста, проверьте. У меня несколько таблиц, некоторые из которых используют внутреннее соединение и некоторые внешние соединения. Мне хотелось присоединиться к таблицам после фильтрации некоторых строк. Когда я пытаюсь, чтобы записи не попадали в внешние соединения. Но я могу, если я сохраню его во внутреннем соединении. Я хотел знать, что лучше всего подходит в этом случае, а также как фильтровать записи фильтровать записи таблицы E.Пожалуйста, голосуйте за мой вопрос, поскольку я нахожусь в процессе обучения и получения репутации :) – gowthi
Каждый движок базы данных разные и разные версии. Таким образом, каждый движок будет оптимизировать запрос по-разному. Когда размещение критериев фильтрации не влияет на результаты, большинство современных двигателей будут переводить критерии в те места, которые лучше всего подходят для оптимальной производительности; иногда оставляя их там, где клаузулы иногда применяют их к результатам до объединения. Итак: ваш вопрос: «Я хочу знать, как фильтровать левую таблицу в левом внешнем соединении перед присоединением к таблицам». Обычно я делаю это в предложении where и позволяю оптимизировать движок. Я также думаю, что это делает его более читаемым. – xQbert