соединение с t-sql, но с сохранением строки объединенной таблицы

#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 эквивалентна an inner 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;
  

DB<>Скрипка

Комментарии:

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