簡體   English   中英

從T-SQL中的其他列派生列

[英]Deriving columns from other column in T-SQL

我在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

我知道我可能必須在T-SQL中使用STRING_AGG,但是我似乎無法弄清楚。 有任何想法嗎?

如果您的sql-server版本支持STRING_AGG函數。

您可以嘗試根據條件t2.[Book Title] <> t1.[Book Title]進行自我加入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

我將使用相關的子查詢來做到這一點:

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;

與在整個表中循環以為每一行重建字符串相比,在titles上調用replace()通常具有更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM