SQL – объединить две таблицы столько раз, сколько совпадений есть в первой таблице

Основная таблица

Имя Вт ЧАС Д Основной элемент 1 100 500 300 Основной пункт 2 100 600 300 Основной пункт 3 200 500 300 Основной пункт 4 100 500 300 Основной пункт 5 100 600 300 Основной пункт 6 200 500 300

Вторичный стол

Имя Вт ЧАС Д Второстепенный элемент 1 100 500 300 Второстепенный элемент 2 100 600 300 Второстепенный пункт 3 200 500 300 Второстепенный пункт 4 100 500 300 Второстепенный пункт 5 100 600 300 Второстепенный пункт 6 200 500 300

Результат

Имя Вт ЧАС Д Основной элемент 1 100 500 300 Второстепенный элемент 1 100 500 300 Второстепенный пункт 4 100 500 300 Основной пункт 4 100 500 300 Второстепенный элемент 1 100 500 300 Второстепенный пункт 4 100 500 300

Ш = 100, В = 500, Г = 300.

Как написать запрос, чтобы каждая строка из первой таблицы дополнялась результатами из второй?

Можно ли сделать это?

Изображение для лучшего понимания ↓

цветное изображение

Укажите структуру таблицы и примеры данных в виде операторов DDL (т. е. CREATE TABLE ..., и INSERT INTO ...). Но на самом деле я не думаю, что это возможно только с чистыми запросами SQL (хотя может быть и с хранимыми процедурами)

derpirscher 06.05.2024 12:34

Какую СУБД вы используете? Как на самом деле выглядят соответствующие столбцы в ваших таблицах? Действительно ли это текст с числом в конце, определяющим взаимосвязь? В любом случае, такое ощущение, что это в основном UNION с некоторой сортировкой.

BenderBoy 06.05.2024 12:35

Да, всегда помечайте SQL-запросы своей СУБД. Я опубликовал ответ, и, несмотря на использование стандартного SQL, вы, возможно, используете СУБД, которая не поддерживает этот синтаксис.

Thorsten Kettner 06.05.2024 13:33
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
3
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы хотите объединить строки основной таблицы со строками вторичной таблицы, соответствующими первой. И вы хотите, чтобы они были отсортированы определенным образом. Итак, мы должны использовать UNION ALL, чтобы получить объединение, и создать ключ сортировки. Один из способов сделать это:

select name, w, h, d
from
(
  select name, w, h, d, name as sortkey
  from primary_table
  where w = 100 and h = 500 and d = 300
  union all
  select s.name, w, h, d, p.name || '#' || s.name as sortkey
  from primary_table p
  join secondary_table s using (w, h, d)
  where w = 100 and h = 500 and d = 300
) unioned
order by sortkey;
Ответ принят как подходящий

Выберите строки из primary_data, в которых есть пары secondary_data и union, результат внутреннего соединения primary_data и secondary_data в столбцах w, h, d.

select name, w, h, d
from ( select
         *,
         name as prim_name,
         1 as is_prim
       from primary_data as p
       where exists( select *
                     from secondary_data as s
                     where s.w = p.w and s.h = p.h and s.d = p.d )
       union all
       select s.*, p.name, 0
       from primary_data as p
       join secondary_data as s
       on s.w = p.w and s.h = p.h and s.d = p.d ) as t
where w = 100 and h = 500 and d = 300
order by prim_name, is_prim desc, name;

db<>рабочий пример

См. пример. (семантически эквивалентный ответ @ThorstenKettner)

select t.name,w,h,d
from(
  select t1.name,w,h,d, name as key1,'' as key2
  from PrimaryTable t1
  -- where w = 100 and h = 500 and d = 300
  union all
  select t2.name,t2.w,t2.h,t2.d, t1.name as key1, t2.name as key2
  from PrimaryTable t1
  inner join SecondaryTable t2 on t1.w=t2.w and t1.h=t2.h and t1.d=t2.d
  -- where t1.w = 100 and t1.h = 500 and t1.d = 300
) t
order by w,h,d,key1,key2

Заказ по w,h,d становится более понятным и наглядным, если не использовать фильтр ГДЕ.

Демо

Ваш ответ обязательно требует положительного голоса.

Imran Zahoor 06.05.2024 20:08

Другие вопросы по теме