Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / FULL JOIN / 25 сообщений из 43, страница 1 из 2
17.04.2019, 13:24
    #39802753
Lomaster_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Здравствуйте.

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

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

Спасибо.
...
Рейтинг: 0 / 0
17.04.2019, 13:29
    #39802754
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_,

складывайте все однородные данные в одну таблицу
суррогатные ключи
ОЛАП
и вот это вот всё
...
Рейтинг: 0 / 0
17.04.2019, 13:29
    #39802756
Lomaster_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Пример:

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
...
Рейтинг: 0 / 0
17.04.2019, 13:30
    #39802757
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
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 не устраивает?
...
Рейтинг: 0 / 0
17.04.2019, 13:33
    #39802759
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
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

это какой то кросс джоин.
...
Рейтинг: 0 / 0
17.04.2019, 13:54
    #39802790
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
В FULL JOIN обязательно должно быть условие ON.
Показанный SELECT неработоспособен.
...
Рейтинг: 0 / 0
17.04.2019, 14:16
    #39802811
Lomaster_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Просто пишу с телефона. Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.
А разве union не присоединение снизу? Потому что мне надо после с этими данными производить математические вычисления типа с1 / с3 * 100
...
Рейтинг: 0 / 0
17.04.2019, 14:21
    #39802816
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_Просто пишу с телефона. Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.
так у вас проблема то скорее всего именно в той части, которую вы не написали.
...
Рейтинг: 0 / 0
17.04.2019, 14:26
    #39802821
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.

Все поля должны иметь один тип, размер, и порядок.
При соединении нескольких разносортных, по разному обслуживаемых баз,
обязательно через некоторое время вылезет несоответствие.
...
Рейтинг: 0 / 0
17.04.2019, 14:28
    #39802823
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_Просто пишу с телефона. Поэтому не дописал селект думал понятно что во всех id должен быть одинаковый.
А разве union не присоединение снизу? Потому что мне надо после с этими данными производить математические вычисления типа с1 / с3 * 100
как у вас найдётся время, опишите что не так, а мы пока погадаем
...
Рейтинг: 0 / 0
17.04.2019, 14:32
    #39802827
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
TaPaKа мы пока погадаем
ну если включен режим гаданий, то ставлю на то, что у него
Код: sql
1.
2.
3.
4.
5.
select ...
from t1 
full join t2 on t2.id = t1.id
full join t3 on t3.id = t1.id
...


это объяснило бы
Lomaster_но при последующих соединениях данные не соединяются с данными из второй таблицы и последующими
...
Рейтинг: 0 / 0
17.04.2019, 14:38
    #39802835
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
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
...
Странно всё это.
...
Рейтинг: 0 / 0
17.04.2019, 14:42
    #39802838
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
982183что если t1.id - пустой,
то берется первый id из t2,
а если и он пустой, то первый id из t3

Нет никаких "первых ID" coalesce не берет, это функция работает не с наборами данных а со значениями.
...
Рейтинг: 0 / 0
17.04.2019, 14:49
    #39802844
Lomaster_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Наверное не очень хороший пример был.

Код: sql
1.
2.
3.
4.
5.
6.
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



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

А так нет.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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...
...
Рейтинг: 0 / 0
17.04.2019, 14:49
    #39802845
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_Наверное не очень хороший пример был.

Код: sql
1.
2.
3.
4.
5.
6.
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




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

А так нет.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 в условия соединения
...
Рейтинг: 0 / 0
17.04.2019, 14:53
    #39802847
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_,

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

а по каким условиям связаны t2 и t3?
...
Рейтинг: 0 / 0
17.04.2019, 15:02
    #39802856
Lomaster_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Посетитель,

Это не решит проблемы в первом варианте. А во втором плохо читабельно. Я и спрашиваю есть ли какие механизмы уменьшения кода. Может я чего нибудь не знаю 😀
...
Рейтинг: 0 / 0
17.04.2019, 15:06
    #39802864
Lomaster_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
TaPaK,

У всех трёх есть одинаковые поля id1 id2 id3 но разные данные.
...
Рейтинг: 0 / 0
17.04.2019, 15:06
    #39802865
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_Посетитель,

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

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

Код: sql
1.
2.
3.
4.
5.
6.
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



Зы. не люблю почему-то, когда поля присоединяемой таблицы указывают справа.
...
Рейтинг: 0 / 0
17.04.2019, 15:08
    #39802867
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Lomaster_TaPaK,

У всех трёх есть одинаковые поля id1 id2 id3 но разные данные.
и где это в предикатах обозначено?
...
Рейтинг: 0 / 0
17.04.2019, 15:12
    #39802869
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
msLex982183что если t1.id - пустой,
то берется первый id из t2,
а если и он пустой, то первый id из t3
Нет никаких "первых ID" coalesce не берет, это функция работает не с наборами данных а со значениями.
Оно понятно, но что автор мел в виду, когда подставлял id из других таблиц?
И что возьмет coalesce в этом случае?
...
Рейтинг: 0 / 0
17.04.2019, 15:13
    #39802871
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
982183msLexпропущено...

Нет никаких "первых ID" coalesce не берет, это функция работает не с наборами данных а со значениями.
Оно понятно, но что автор мел в виду, когда подставлял id из других таблиц?
И что возьмет coalesce в этом случае?
всё нормально возьмёт, общий ключ id
...
Рейтинг: 0 / 0
17.04.2019, 15:15
    #39802872
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Понял. Автор доупрощался до нечитабельности.
...
Рейтинг: 0 / 0
17.04.2019, 15:18
    #39802875
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Вру. Это я спьяну вместо Full join увидел union all
...
Рейтинг: 0 / 0
17.04.2019, 15:18
    #39802876
Lomaster_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FULL JOIN
Посетитель,

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


Большое спасибо.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / FULL JOIN / 25 сообщений из 43, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]