Имя: Пароль:
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) "как правильно" - ответ в зависимости от того какая задача стоит?
На вход дал три таблицы и спрашиваешь как правильно, но не написал, какой результат необходимо получить. Вопроса, можно сказать нет.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn