powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL избыточные данные при left join
9 сообщений из 9, страница 1 из 1
SQL избыточные данные при left join
    #40004543
volnistii11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть основная таблица и несколько второстепенных. Одной записи из основной таблицы может соответствовать несколько записей из второстепенной. Мне нужно вывести их как единую таблицу, если я просто делаю через 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
SQL избыточные данные при left join
    #40004546
volnistii11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получилось изменить приложенный файл, поэтому вот он
...
Рейтинг: 0 / 0
SQL избыточные данные при left join
    #40004548
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на первом рисунке нет дублирующейся информации
...
Рейтинг: 0 / 0
SQL избыточные данные при left join
    #40004550
Фотография 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
...
Рейтинг: 0 / 0
SQL избыточные данные при left join
    #40004553
volnistii11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow
на первом рисунке нет дублирующейся информации
Я понимаю, что каждая строка уникальна и прочее. Но я описал проблему, что получаю, что хочу получить. Постарался максимально понятно
...
Рейтинг: 0 / 0
SQL избыточные данные при left join
    #40004554
volnistii11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SQL избыточные данные при left join
    #40004556
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volnistii11
а можно объяснить, если не сложно?

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

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

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


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