Получение столбцов из другого столбца в T-SQL - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть таблица в T-SQL в книгах с одним столбцом, который имеет несколько названий книг:

    Book Title
------------------
Romeo and Juliet

Hamlet

All The King's Men

То, что я пытаюсь сделать, это добавить второй столбец, который называется «Другие заголовки», который содержит строку всех других заголовков в столбце , за исключением для заголовка в текущей строке, т.е.

 Book Title                    Other Titles
------------------          ----------------
Romeo and Juliet            Hamlet, All The Kings Men

Hamlet                      R & J, All The King's Men

All The King's Men          R&J, Hamlet

Я знаю, что для этого мне нужно использовать STRING_AGG в T-SQL, но я просто не могу понять это. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Я бы сделал это, используя коррелированный подзапрос:

select b.*,
       (select string_agg(b2.title, ', ') within group (order by b2.title)
        from books b2
        where b2.title <> b.title
       ) as other_titles
from books b;

Коррелированный подзапрос облегчает сохранение других столбцов, которые могут быть в вашей таблице.

Если честно, производительность не будет особенно хорошей. Вы можете объединить все вместе и затем удалить свой заголовок:

select b.*,
       stuff(replace(bb.titles, ', ' + b.title, ''), 1, 2, '') as other_titles
from books b cross join
     (select ', ' + string_agg(b2.title, ', ') as titles
      from books
     ) bb;

Вызов replace() на titles, как правило, будет иметь лучшую производительность, чем цикл по всей таблице для восстановления строки для каждой строки.

0 голосов
/ 16 сентября 2018

Если ваша версия sql-сервера поддерживает функцию STRING_AGG.

Вы можете попытаться выполнить самостоятельное соединение по условию t2.[Book Title] <> t1.[Book Title] , затем использовать функцию STRING_AGG,

CREATE TABLE T(
 [Book Title] VARCHAR(50)
);

INSERT INTO T VALUES ('Romeo and Juliet');
INSERT INTO T VALUES ('Hamlet');
INSERT INTO T VALUES ('All The King''s Men');


SELECT t1.[Book Title],
       STRING_AGG ( t2.[Book Title] , ',' ) 'Other Titles'
FROM T t1 
INNER JOIN T t2 ON t2.[Book Title] <> t1.[Book Title]
group by t1.[Book Title]

sqlfiddle

...