#sql-server #tsql
#sql-server #tsql
Вопрос:
Можно ли сохранить объединенную строку в качестве заголовка в верхней строке? Основной запрос намного сложнее с запросом cte-иерархии и несколькими объединениями. Что мне нужно, так это оставить объединенные таблицы всегда вверху, чтобы использовать их в качестве заголовка.
Пример таблицы:
create table temp_items
(
grp nvarchar(2),
item nvarchar(2)
);
insert into temp_items (grp, item)
values ('G1', 'I1'), ('G1', 'I2'), ('G1', 'I3');
create table temp_groups
(
grp nvarchar(2),
name nvarchar(18)
);
insert into temp_groups (grp, name) values ('G1', 'Group 1');
select g.grp, g.name, i.item
from temp_groups g
join temp_items i on g.grp = i.grp
Желаемый результат:
grp | name | item
---- --------- ----
G1 | Group 1 | NULL
G1 | Group 1 | I1
G1 | Group 1 | I2
G1 | Group 1 | I3
Заранее спасибо.
Комментарии:
1. Просто запись
join
эквивалентна aninner join
, и, таким образом, вы не увидите ни одной строки, в которой нет соответствующего значения вtemp_items i
….. вам нужно будет использовать правильноеleft (outer) join
значение, чтобы получить то, что вы ищете….2. A
LEFT JOIN
не изменит поведение здесь, @marc_s . По сути, операция стремится «создать» дополнительную строку, в которой переходJOIN
к другой таблице не завершен.
Ответ №1:
Одной из идей было бы использовать VALUES
для «создания» дополнительной строки:
SELECT g.grp,
g.[name],
i.item
FROM dbo.temp_groups g
CROSS APPLY (VALUES(g.grp),(NULL))V(grp)
LEFT JOIN dbo.temp_items i ON v.grp = i.grp;
Комментарии:
1. Спасибо, работает как заклинание. Возможно ли также добавить пустую строку (заполненную нулями) с перекрестным применением?
2. Это не
APPLY
то, что это делает, @user2463808, это конструкцияVALUES
таблицы. Вы можете создать с ней любую строку, какую захотите.
Ответ №2:
Возможно, вы захотите попробовать просто добавить запрос в таблицу группы и назначить ему индекс сортировки, например, как следует из следующего примера:
WITh cte AS(
SELECT 1 AS srt, g.grp, g.name, NULL AS item
FROM temp_groups g
UNION ALL
SELECT 2 AS srt, g.grp, g.name, i.item
FROM temp_groups g
INNER JOIN temp_items i on g.grp = i.grp
)
SELECT grp, name, item
FROM cte
ORDER BY srt