Запрос на объединение нескольких строк в одну строку / столбец без FOR XML - РЕДАКТИРОВАТЬ с FOR XML - PullRequest
1 голос
/ 07 мая 2020

У меня довольно сложный запрос, который я пытаюсь составить. У меня есть 2 таблицы, tblSMS и tblSMSSent, которые содержат данные для SMS-сообщений, отправленных и полученных через API. Мне нужно написать запрос, который дает мне каждое отправленное сообщение в сочетании с каждым ответом на это сообщение. Я пробовал сделать это с помощью LiNQ, но мой второй запрос на получение сообщений для каждого отправленного сообщения ничего не возвращает.

Вот мой первоначальный запрос на получение каждого отправленного сообщения:

var query = "Select top({0}) * from (" +
"   SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY[date] desc) " +
"   AS RowNum, RTRIM(phone) as phone, [date], " +
"   RTRIM(LEFT(result,50)) as result, RTRIM(debtor) as debtor, " +
"   RTRIM(sms) as OrigBody, RTRIM([user]) as [user], " +
"   RTRIM(MessageId) as MessageId FROM tblSMSSent " +
"   where RTRIM([user]) = '{2}' " +
") AS tbl WHERE tbl.RowNum > {1} "

Этот запрос возвращает данные правильно. Когда я запускаю запрос с соединением, например

Select top{0} * from ( 
    SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY[date] desc)  
    AS RowNum, RTRIM(phone) as phone, [date],  
RTRIM(LEFT(result,50)) as result, RTRIM(debtor) as debtor,  
    RTRIM(sms) as OrigBody, MessageBody, RTRIM([user]) as [user],  
    RTRIM(MessageId) as MessageId FROM tblSMSSent  
    right join tblSMS on messageId=outgoingmessageId
    where RTRIM([user]) = '{2}'  
) AS tbl WHERE tbl.RowNum > {1}

, он возвращает несколько строк для каждого MessageBody, соответствующего этому MessageId. Мне нужно, чтобы MessageBody содержал каждое сообщение от tblSMS в одной строке с определенными разделителями.

Это некоторые образцы данных, которые я получаю:

Current Sample Data

Это данные, которые мне нужны: Desired Sample Data

Я попытался (безуспешно) выполнить sh это с помощью LiNQ, как я сказал выше, но это не тот путь, по которому я хочу идти, и по возможности предпочитаю сохранить его в виде одного запроса. Поскольку я использую более старую версию SQL серверных команд, таких как For XML, недоступны для помощи в манипулировании данными.

Поскольку я хочу завершить это, я отправляю эти данные ответа обратно клиенту для отображения в HTML. Как сделать разрыв строки между объединенными результатами?

Какие у меня есть варианты?

Спасибо.

1 Ответ

0 голосов
/ 07 мая 2020

Хорошо. Я нашел решение, почерпнутое из https://www.sqlmatters.com/Articles/Converting%20row%20values%20in%20a%20table%20to%20a%20single%20concatenated%20string.aspx.

То, что я сделал, добавлено в другой подзапрос. После некоторых исследований я обнаружил, что могу использовать For XML, но некоторые из расширенных функций XML недоступны.

Вот мой последний запрос:

Select  * from ( 
    SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY[date] desc)  
    AS RowNum, RTRIM(phone) as phone, [date],  
    RTRIM(LEFT(result,50)) as result, RTRIM(debtor) as debtor,  
    RTRIM(sms) as OrigBody,  RTRIM([user]) as [user],  
    RTRIM(MessageId) as MessageId ,
    (SELECT STUFF((SELECT '^' + MessageBody
            FROM tblSMS 
            WHERE outgoingMessageId=MessageId
            FOR XML PATH('')) ,1,1,'')) AS MessageText

    FROM tblSMSSent  
    where RTRIM([user]) = 'userName'  and MessageId<>0
) AS tbl WHERE tbl.RowNum > 0

Это дает мне желаемый набор результатов, ограниченный '^', хотя я могу изменить разделитель.

FOR XML был представлен в SQL Server 2005, который я и использую. Я понял, что это нововведение 2010 года, но при попытке выполнить другой запрос я использовал другие функции, которые мой Сервер не понимал.

Спасибо user25407 за вашу помощь в этом.

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