Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 FULL JOIN  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Здравствуйте.

Нужна помощь, а может и нет 😀.

Пишем на Sql server 2008 отчёты, которые запускаются каждый день. В отчёте требуется объединять несколько таблиц, обычно от 5 до 10. Некоторые берём с другого сервера не MS.
Ситуация, при объединении нескольких таблиц, получается некрасивая картинка. Т.е. если в первой таблице нет каких то данных из второй то я из добавляю через COALESCE, но при последующих соединениях данные не соединяются с данными из второй таблицы и последующими. Я нашел решение только если выделять каждые две соединённые таблицы в отдельный селект. В результате получается кода на 1000 строк, после очень сложно разобраться что к чему.
Может кто то посоветует как можно по другому решить эту проблему.

Спасибо.
17 апр 19, 13:24    [21864890]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2375
Lomaster_,

складывайте все однородные данные в одну таблицу
суррогатные ключи
ОЛАП
и вот это вот всё
17 апр 19, 13:29    [21864898]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Пример:

Select coalesce(id, t2.id, t3.id ), c1, c2, t2.c3, t2.c4, t3.c5, t3.c6 from t1
Full join (select id, c3, c4 from t2) as t2
Full join (select id, c5, c6 from t3) as t3
17 апр 19, 13:29    [21864900]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Lomaster_
Пример:

Select coalesce(id, t2.id, t3.id ), c1, c2, t2.c3, t2.c4, t3.c5, t3.c6 from t1
Full join (select id, c3, c4 from t2) as t2
Full join (select id, c5, c6 from t3) as t3

с такими джоинами, чем вас UNION не устраивает?
17 апр 19, 13:30    [21864903]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
Lomaster_
Пример:

Select coalesce(id, t2.id, t3.id ), c1, c2, t2.c3, t2.c4, t3.c5, t3.c6 from t1
Full join (select id, c3, c4 from t2) as t2
Full join (select id, c5, c6 from t3) as t3


это какой то кросс джоин.
17 апр 19, 13:33    [21864910]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
В FULL JOIN обязательно должно быть условие ON.
Показанный SELECT неработоспособен.
17 апр 19, 13:54    [21864965]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Просто пишу с телефона. Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.
А разве union не присоединение снизу? Потому что мне надо после с этими данными производить математические вычисления типа с1 / с3 * 100
17 апр 19, 14:16    [21865010]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
Lomaster_
Просто пишу с телефона. Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.

так у вас проблема то скорее всего именно в той части, которую вы не написали.
17 апр 19, 14:21    [21865020]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Lomaster_
Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.

Все поля должны иметь один тип, размер, и порядок.
При соединении нескольких разносортных, по разному обслуживаемых баз,
обязательно через некоторое время вылезет несоответствие.
17 апр 19, 14:26    [21865027]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Lomaster_
Просто пишу с телефона. Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.
А разве union не присоединение снизу? Потому что мне надо после с этими данными производить математические вычисления типа с1 / с3 * 100

как у вас найдётся время, опишите что не так, а мы пока погадаем
17 апр 19, 14:28    [21865033]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
TaPaK
а мы пока погадаем

ну если включен режим гаданий, то ставлю на то, что у него
select ...
from t1 
full join t2 on t2.id = t1.id
full join t3 on t3.id = t1.id
...

это объяснило бы
Lomaster_
но при последующих соединениях данные не соединяются с данными из второй таблицы и последующими
17 апр 19, 14:32    [21865039]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Lomaster_
Select coalesce(id, t2.id, t3.id ), c1, c2, t2.c3, t2.c4, t3.c5, t3.c6 from t1

Ни разу не пользовался coalesce в таком режиме, но правильно я понимаю,
что если t1.id - пустой,
то берется первый id из t2,
а если и он пустой, то первый id из t3
...
Странно всё это.
17 апр 19, 14:38    [21865057]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
msLex
Member

Откуда:
Сообщений: 7730
982183
что если t1.id - пустой,
то берется первый id из t2,
а если и он пустой, то первый id из t3


Нет никаких "первых ID" coalesce не берет, это функция работает не с наборами данных а со значениями.
17 апр 19, 14:42    [21865062]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Наверное не очень хороший пример был.

Select
    id1, id2, id3, t1.c1, t1.c2, t2.c3, t2.c4, t3.c5, t3.c6 from t1
Full join (select id1, id2, id3, c3, c4 from t2) as t2
on t1.id1=t2.id1 and t1.id2=t2.id2 and t1.id3=t2.id3
full join (select id1, id2, id3, c5, c6 from t3) as t3
on t1.id1=t3.id1 and t1.id2=t3.id2 and t1.id3=t3.id3


Вот тут если данные есть во второй и третьей таблицах а в первой нет, то они будут как отдельные строки.

А так нет.
select id1, id2, id3, t1.c1, t1.c2, t1.c3, t1.c4, t3.c5, t3.c6
from (
    Select id1, id2, id3, t1.c1, t1.c2, t2.c3, t2.c4 from t1 ... Условия
    Full join (select id1, id2, id3, c3, c4 from t2 ... Условия) as t2
    on t1.id1=t2.id1 and t1.id2=t2.id2 and t1.id3=t2.id3
) As t1
full join (select id1, id2, id3, c5, c6 from t3 ... Условия) as t3
on t1.id1=t3.id1 and t1.id2=t3.id2 and t1.id3=t3.id3


Тут только 3 таблицы а если их 10...
17 апр 19, 14:49    [21865073]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
Lomaster_
Наверное не очень хороший пример был.

Select
    id1, id2, id3, t1.c1, t1.c2, t2.c3, t2.c4, t3.c5, t3.c6 from t1
Full join (select id1, id2, id3, c3, c4 from t2) as t2
on t1.id1=t2.id1 and t1.id2=t2.id2 and t1.id3=t2.id3
full join (select id1, id2, id3, c5, c6 from t3) as t3
on t1.id1=t3.id1 and t1.id2=t3.id2 and t1.id3=t3.id3



Вот тут если данные есть во второй и третьей таблицах а в первой нет, то они будут как отдельные строки.

А так нет.
select id1, id2, id3, t1.c1, t1.c2, t1.c3, t1.c4, t3.c5, t3.c6
from (
    Select id1, id2, id3, t1.c1, t1.c2, t2.c3, t2.c4 from t1 ... Условия
    Full join (select id1, id2, id3, c3, c4 from t2 ... Условия) as t2
    on t1.id1=t2.id1 and t1.id2=t2.id2 and t1.id3=t2.id3
) As t1
full join (select id1, id2, id3, c5, c6 from t3 ... Условия) as t3
on t1.id1=t3.id1 and t1.id2=t3.id2 and t1.id3=t3.id3



Тут только 3 таблицы а если их 10...


ну так добавляйте coalesce в условия соединения
17 апр 19, 14:49    [21865076]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Lomaster_,

автор
Вот тут если данные есть во второй и третьей таблицах а в первой нет, то они будут как отдельные строки.

а по каким условиям связаны t2 и t3?
17 апр 19, 14:53    [21865083]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Посетитель,

Это не решит проблемы в первом варианте. А во втором плохо читабельно. Я и спрашиваю есть ли какие механизмы уменьшения кода. Может я чего нибудь не знаю 😀
17 апр 19, 15:02    [21865106]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
TaPaK,

У всех трёх есть одинаковые поля id1 id2 id3 но разные данные.
17 апр 19, 15:06    [21865117]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
Lomaster_
Посетитель,

Это не решит проблемы в первом варианте. А во втором плохо читабельно. Я и спрашиваю есть ли какие механизмы уменьшения кода. Может я чего нибудь не знаю 😀


вам просто лень проверять.

Select
    id1, id2, id3, t1.c1, t1.c2, t2.c3, t2.c4, t3.c5, t3.c6 from t1
Full join (select id1, id2, id3, c3, c4 from t2) as t2
on t1.id1=t2.id1 and t1.id2=t2.id2 and t1.id3=t2.id3
full join (select id1, id2, id3, c5, c6 from t3) as t3
on coalesce(t1.id1,t2.id1)=t3.id1 and coalesce(t1.id2,t2.id2)=t3.id2 and coalesce(t1.id3,t2.id3)=t3.id3


Зы. не люблю почему-то, когда поля присоединяемой таблицы указывают справа.
17 апр 19, 15:06    [21865118]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Lomaster_
TaPaK,

У всех трёх есть одинаковые поля id1 id2 id3 но разные данные.

и где это в предикатах обозначено?
17 апр 19, 15:08    [21865121]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
982183
Member

Откуда: VL
Сообщений: 3350
msLex
982183
что если t1.id - пустой,
то берется первый id из t2,
а если и он пустой, то первый id из t3

Нет никаких "первых ID" coalesce не берет, это функция работает не с наборами данных а со значениями.

Оно понятно, но что автор мел в виду, когда подставлял id из других таблиц?
И что возьмет coalesce в этом случае?
17 апр 19, 15:12    [21865124]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
982183
msLex
пропущено...

Нет никаких "первых ID" coalesce не берет, это функция работает не с наборами данных а со значениями.

Оно понятно, но что автор мел в виду, когда подставлял id из других таблиц?
И что возьмет coalesce в этом случае?

всё нормально возьмёт, общий ключ id
17 апр 19, 15:13    [21865129]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Понял. Автор доупрощался до нечитабельности.
17 апр 19, 15:15    [21865130]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Вру. Это я спьяну вместо Full join увидел union all
17 апр 19, 15:18    [21865134]     Ответить | Цитировать Сообщить модератору
 Re: FULL JOIN  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Посетитель,

Это именно то что нужно. Я просто не правильно понял, где использовать COALESCE. Картинка с другого сайта.

Большое спасибо.
17 апр 19, 15:18    [21865135]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить