Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL избыточные данные при left join / 9 сообщений из 9, страница 1 из 1
01.10.2020, 14:00
    #40004543
volnistii11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
У меня есть основная таблица и несколько второстепенных. Одной записи из основной таблицы может соответствовать несколько записей из второстепенной. Мне нужно вывести их как единую таблицу, если я просто делаю через left join, то у меня выводится куча избыточной, дублирующей информации, которая мне не нужна.

Например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT * 
FROM in_fileindex_main main
LEFT JOIN in_fileindex_additionaly add ON 
    (main.DocumentNumber = add.DocumentNumber)
LEFT JOIN in_fileindex_applicability app ON 
    (main.DocumentNumber = app.DocumentNumber)
WHERE 1;



То выведется что-то типа изображенного на картинке 1.

Как видно, add и app таблицы не связаны между собой, они связаны только с основной таблицей main. Можно ли как-то построить запрос, чтобы не было дублирующей информации и вывод был соответственно, как на картинке 2.
...
Рейтинг: 0 / 0
01.10.2020, 14:04
    #40004546
volnistii11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
Не получилось изменить приложенный файл, поэтому вот он
...
Рейтинг: 0 / 0
01.10.2020, 14:14
    #40004548
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
на первом рисунке нет дублирующейся информации
...
Рейтинг: 0 / 0
01.10.2020, 14:27
    #40004550
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
Это будет что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH 
cte1 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentNumber ORDER BY id) rn
          FROM in_fileindex_additionaly ),
cte2 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentNumber ORDER BY id) rn
          FROM in_fileindex_applicability ),
cte3 AS ( SELECT GREATEST((SELECT MAX(rn) FROM cte1), (SELECT MAX(rn) FROM cte2)) rn )
SELECT *
FROM in_fileindex_main main
CROSS JOIN cte3
LEFT JOIN cte1 USING (DocumentNumber, rn)
LEFT JOIN cte2 USING (DocumentNumber, rn)
WHERE COALESCE(cte1.DocumentNumber, cte2.DocumentNumber) IS NOT NULL
ORDER BY DocumentNumber, rn
...
Рейтинг: 0 / 0
01.10.2020, 14:29
    #40004553
volnistii11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
ScareCrow
на первом рисунке нет дублирующейся информации
Я понимаю, что каждая строка уникальна и прочее. Но я описал проблему, что получаю, что хочу получить. Постарался максимально понятно
...
Рейтинг: 0 / 0
01.10.2020, 14:30
    #40004554
volnistii11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
Akina
Это будет что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH 
cte1 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentNumber ORDER BY id) rn
          FROM in_fileindex_additionaly ),
cte2 AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentNumber ORDER BY id) rn
          FROM in_fileindex_applicability ),
cte3 AS ( SELECT GREATEST((SELECT MAX(rn) FROM cte1), (SELECT MAX(rn) FROM cte2)) rn )
SELECT *
FROM in_fileindex_main main
CROSS JOIN cte3
LEFT JOIN cte1 USING (DocumentNumber, rn)
LEFT JOIN cte2 USING (DocumentNumber, rn)
WHERE COALESCE(cte1.DocumentNumber, cte2.DocumentNumber) IS NOT NULL
ORDER BY DocumentNumber, rn

Спасибо, а можно объяснить, если не сложно?А, и можно как-то это сделать без WITH, а то версия моего mysql<8.0, а именно 5.5, это практически максимальная на openserver
...
Рейтинг: 0 / 0
01.10.2020, 14:34
    #40004556
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
volnistii11
а можно объяснить, если не сложно?

Давайте Вы сначала выполните, изучите и попробуете понять, что делает
Код: sql
1.
WITH cte1 AS (...) SELECT * FROM cte1

потом
Код: sql
1.
WITH cte1 AS (...), cte2 AS (...) SELECT * FROM cte2

... и так далее. И вот когда не поймёте очередной вывод - тогда и спросите конкретно по моменту.
...
Рейтинг: 0 / 0
01.10.2020, 14:35
    #40004557
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
volnistii11
можно как-то это сделать без WITH, а то версия моего mysql<8.0, а именно 5.5
Можно, но мне пальцев жалко. Делайте нумерацию на переменных (см. ФАК), а потом собирайте как у меня.
...
Рейтинг: 0 / 0
01.10.2020, 15:05
    #40004567
volnistii11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL избыточные данные при left join
Akina
volnistii11
можно как-то это сделать без WITH, а то версия моего mysql<8.0, а именно 5.5
Можно, но мне пальцев жалко. Делайте нумерацию на переменных (см. ФАК), а потом собирайте как у меня.
Понял, спасибо, буду разбираться)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL избыточные данные при left join / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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