Выберите несколько строк в одну переменную в SQL-запросе - PullRequest
3 голосов
/ 10 марта 2011
SELECT ft.ThreadTitle AS Title, 
fr.ReplyText + ' ' + ua2.Username + ' ' + ft.ThreadText + ' '  +

-- THIS NEXT LINE IS WHAT I WANT TO ACHIEVE:

(Select ReplyText from ForumReply Where ThreadID=ft.ThreadID) 

-- THE ABOVE LINE HAVE MULTIPLE ROWS/VALUES THAT I WANT TO JOIN INTO ONE VARIABLE. HOW?
AS [Content], 

ss.Domain, 
ss.SiteID, 
ft.ThreadID AS ObjectId
FROM         dbo.ForumReply AS fr INNER JOIN
                      dbo.ForumThreads AS ft ON fr.ThreadID = ft.ThreadID INNER JOIN
                      dbo.User_Account AS ua1 ON ft.CreateByUserID = ua1.UserID INNER JOIN
                      dbo.User_Account AS ua2 ON fr.ReplyUserID = ua2.UserID INNER JOIN
                      dbo.SysT_Site AS ss ON ua1.SiteID = ss.SiteID

Этот запрос выдает ошибку: Подзапрос вернул более 1 значения.Это недопустимо, когда подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Как переписать этот запрос, чтобы он работалчто я получаю все значения в одну переменную?Конечным результатом должно быть «Представление», которое выглядит следующим образом:

.ObjectID int

.Content (строка со всем текстом, существующим в Forumthread.threadText и forumReply.ReplyText)

.Доменная строка

.SiteID int

Ответы [ 4 ]

18 голосов
/ 10 марта 2011

Опираясь на комментарий Мартина:

DECLARE @t TABLE  (id int, ReplyText varchar(100))
INSERT INTO @t (id, ReplyText) VALUES (1, 'So Long,')
INSERT INTO @t (id, ReplyText) VALUES  (2, 'And Thanks for')
INSERT INTO @t (id, ReplyText) VALUES  (3, 'All of the Fish!')

SELECT (SELECT replytext + ' '  FROM @t FOR XML PATH('')) AS CONTENT
1 голос
/ 15 декабря 2015

Я использовал STUFF:

SELECT
MyTable.Number AS Number,
(SELECT stuff(
    (
    select ', ' + x from (SELECT MyOtherTable.Name AS x FROM MyOtherTable WHERE MyOtherTable.ID = MyTable.ID) tb 
    FOR XML PATH('')
    )
, 1, 2, ''))AS AllNames

FROM
MyTable

Результат:

Number:   AllNames:
  1       Andrew, Carl
  2       Bobby, Dave
1 голос
/ 30 апреля 2013

Вы можете назначить локальную переменную таким образом.

SELECT @TempVariable = (SELECT replytext + ' ' FROM @t FOR XML PATH(''))
1 голос
/ 10 марта 2011

Вам нужна агрегатная функция concat строки, которая не включена в sql server.

Вы можете создать свою собственную, используя функцию .Net CLr, см. здесь и здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...