Возвращает набор данных с несколькими строками как CSV с одной строкой без временной таблицы - PullRequest
1 голос
/ 22 августа 2011

Я делаю некоторые отчеты по глупой базе данных, и я должен сделать

SELECT [DESC] as 'Description' 
FROM dbo.tbl_custom_code_10 a
INNER JOIN dbo.Respondent b ON CHARINDEX(',' + a.code + ',', ',' + b.CC10) > 0 
WHERE recordid = 116

, который возвращает несколько строк

 Palm
 Compaq
 Blackberry

Редактировать * Схема

Respondent Table (At a Glance) ...

*recordid   lname   fname   address CC10     CC11     CC12     CC13*
116         Smith   John    Street  1,4,5,   1,3,4,   1,2,3,   NULL

Tbl_Custom_Code10

*code   desc*
0       None
1       Palm
10      Samsung
11      Treo
12      HTC
13      Nokia
14      LG
15      HP
16      Dash

Результирующий набор всегда будет 1 строкой, поэтому Джон Смит: | 646-465-4566 | Имеет ежевику, пальму, Compaq | Любит: прогулки по пляжу, радугу, саксофон

Однако мне нужно иметь возможность использовать это в другом запросе ... как

Select b.Name, c.Number, d.MulitLineCrap FROM Tables 

Как мне это сделать, заранее спасибо ...

Кстати, я мог бы также сделать это в LINQ, если у кого-нибудь были какие-либо идеи ...

1 Ответ

2 голосов
/ 22 августа 2011

Вот один из способов составить список, разделенный запятыми, на основе запроса (просто замените запрос внутри первого блока WITH).Теперь, как это сочетается с вашим запросом к b и c, я понятия не имею.Вам нужно будет предоставить более полный вопрос - включая подробности о том, сколько строк возвращается из второго запроса и является ли «MultilineCrap» одинаковым для каждой из этих строк или зависит ли это от данных в b / c.

;WITH x([DESC]) AS 
(
    SELECT 'Palm'
        UNION ALL SELECT 'Compaq'
        UNION ALL SELECT 'Blackberry'
),
y([DESC]) AS
(
    SELECT ',' + [DESC]
    FROM x 
    FOR XML PATH('')
)
SELECT MultilineCrap = STUFF([DESC], 1, 1, '')
FROM y;

РЕДАКТИРОВАТЬ

Учитывая новые требования, возможно, это лучший способ:

CREATE FUNCTION dbo.GetMultiLineCrap
(
    @s VARCHAR(MAX)
) 
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @x VARCHAR(MAX) = '';

    SELECT @x += ',' + [desc]
        FROM dbo.tbl_custom_code_10
        WHERE ',' + @s LIKE '%,' + RTRIM(code) + ',%';

    RETURN (SELECT STUFF(@x, 1, 1, ''));
END
GO

SELECT r.LName, r.FName, MultilineCrap = dbo.GetMultiLineCrap(r.CC10)
    FROM dbo.Respondent AS r
    WHERE recordid = 116;

Пожалуйста, используйте псевдонимы, которые имеют немного смыславместо последовательного применения a, b, ,c и т. д. Ваши запросы будут легче читать, обещаю.

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