Имя: Пароль:
IT
 
Соединение 3-х таблиц Oracle
0 Штурман
 
18.02.20
09:01
Как правильно соединить три таблицы?
К примеру, следующим кодом:


SELECT
First.ID, First.CODE, First.ADDS, Second.ID_CH, Third.*
FROM Table_1 First
LEFT JOIN Table_2 Second ON First.ID = Second.ID
LEFT JOIN Table_3 Third ON Second.ID_CH = Third.ID_CH
WHERE First.CODE IN (
'4156156', '651551', '5616513')


Правильно ли будет соединение?
1 CaIIIka
 
18.02.20
09:05
Может UNION ALL?
2 Штурман
 
18.02.20
09:09
(1) в смысле? это объединение уже будет, а нужно соединение по ключевым полям :)
3 Сияющий в темноте
 
18.02.20
09:26
Inner join есть ?
хотя он и декартово с условием сам в соединение должен завернуть.
4 Штурман
 
18.02.20
09:27
(3) есть, т.е. вместо left писать inner для точного соединения?
5 CaIIIka
 
18.02.20
09:42
Все без исключения соединения работают правильно. И объединение, которое тоже связывает таблицы, в том числе. Вопрос в том, что вы хотите от этого получить? А то, что надо писать inner вместо left для более точного соединения... Или объединение не подходит, потому что нужно соединение по ключевым полям... Это неверный подход к делу.
6 SmartContract
 
18.02.20
10:14
(0) На чем основаны ваши сомнения?
7 Штурман
 
18.02.20
15:02
(5)  вопрос в том, как правильней будет на Oracle сделать соединение, чтобы все данные левой таблицы по ключевому полю соединялись с правой таблицей :)
8 ДенисЧ
 
18.02.20
15:04
(7) Сделай так, как будет правильно на той субд, которую знаешь. Потом сделай так же на оракле.
9 Андроидщик
 
18.02.20
22:06
(7) Очень зависит от того, нужны ли тебе данные из левой таблицы, если их нет в правой таблице.
10 Штурман
 
19.02.20
07:25
если писать LEFT при соединении с 3-й таблицей, то 3-я таблица на некоторых строках выводится со значениями NULL

если же написать INNER вместо LEFT - INNER JOIN Table_3 Third ON Second.ID_CH = Third.ID_CH
то 3-я таблица выводится вроде бы нормально, без столбцов с NULL

как правильней будет?
11 Said_We
 
19.02.20
08:14
(10) Вопрос не ясен. Надо чтобы были все из первой таблицы и все остальные поля если есть из остальных или что-то иное?
12 Штурман
 
19.02.20
08:40
(11)
вопрос в том, что при соединении с 3 таблицей из нее выводятся NULL

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

Если же писать INNER - то NULL нет

Пример:
LEFT
ID         CODE    ADDS     ID_CH    ID_CH1
4156156    11      142      2145     (null)
4156156    11      142      1451     (null)
4156156    11      142      4151     1531
651551     12      153      315      1512
5616513    8       215      1351     14210

INNER
ID         CODE    ADDS     ID_CH    ID_CH1
4156156    11      142      2145     151321
4156156    11      142      1451     4121
4156156    11      142      4151     1531
651551     12      153      315      1512
5616513    8       215      1351     14210
13 Штурман
 
19.02.20
08:41
последний имел в виду так, без null
INNER
ID         CODE    ADDS     ID_CH    ID_CH1
4156156    11      142      4151     1531
651551     12      153      315      1512
5616513    8       215      1351     14210
14 Said_We
 
19.02.20
09:11
(0) 151321 и 4121 откуда взялись в (12) или куда пропали в (13)?
15 Штурман
 
19.02.20
09:15
(14) да пример упрощенный, вот

Пример:
LEFT
ID         CODE    ADDS     ID_CH    ID_CH1
4156156    11      142      2145     (null)
4156156    11      142      1451     (null)
4156156    11      142      4151     4151
651551     12      153      315      315
5616513    8       215      1351     1351

INNER
ID         CODE    ADDS     ID_CH    ID_CH1
4156156    11      142      4151     4151
651551     12      153      315      315
5616513    8       215      1351     1351

Т.е. когда соединение идет по LEFT и условию ID_CH=ID_CH, то почему-то в выборке столбцы с null
если же соединять по INNER, то столбцов с null нет
16 Said_We
 
19.02.20
09:18
INNER Подразумевает пересечение множеств.
Оно возвращает пересечение двух множеств. В терминах таблиц, оно возвращает только записи из обеих таблиц, отвечающие указанному критерию.

http://www.k-press.ru/cs/2009/3/join/join.asp
17 Штурман
 
19.02.20
09:23
(16) это понятно, но почему тогда выводится null при левом запросе?
ведь стоит же условие  ID_CH=ID_CH
однако 3 таблица часть с NULL выводит
18 Said_We
 
19.02.20
09:24
(15) Не пойму вопроса. Внутреннее соединение так работает. Попадают только те записи, которые отвечают условию в соединении.
(17) Левое соединение выводит все записи первой таблицы и если есть, то в правой. Если нет то NULL. Так работает левое соединение.
19 Said_We
 
19.02.20
09:25
(17) Так это в принципе работает.
https://ru.wikipedia.org/wiki/Join_(SQL)
20 Said_We
 
19.02.20
09:28
Вопрос в (0) "как правильно" - ответ в зависимости от того какая задача стоит?
На вход дал три таблицы и спрашиваешь как правильно, но не написал, какой результат необходимо получить. Вопроса, можно сказать нет.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший