Основная таблица
Вторичный стол
Результат
Ш = 100, В = 500, Г = 300.
Как написать запрос, чтобы каждая строка из первой таблицы дополнялась результатами из второй?
Можно ли сделать это?
Изображение для лучшего понимания ↓
Какую СУБД вы используете? Как на самом деле выглядят соответствующие столбцы в ваших таблицах? Действительно ли это текст с числом в конце, определяющим взаимосвязь? В любом случае, такое ощущение, что это в основном UNION
с некоторой сортировкой.
Да, всегда помечайте SQL-запросы своей СУБД. Я опубликовал ответ, и, несмотря на использование стандартного SQL, вы, возможно, используете СУБД, которая не поддерживает этот синтаксис.
Вы хотите объединить строки основной таблицы со строками вторичной таблицы, соответствующими первой. И вы хотите, чтобы они были отсортированы определенным образом. Итак, мы должны использовать 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;
См. пример. (семантически эквивалентный ответ @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
становится более понятным и наглядным, если не использовать фильтр ГДЕ.
Ваш ответ обязательно требует положительного голоса.
Укажите структуру таблицы и примеры данных в виде операторов DDL (т. е.
CREATE TABLE ...,
иINSERT INTO ...
). Но на самом деле я не думаю, что это возможно только с чистыми запросами SQL (хотя может быть и с хранимыми процедурами)