2010-12-13 4 views
1

Приветствия,Вложенная инструкция SELECT в выражении CASE

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

У меня уже есть аналогичный вопрос. Return multiple values in one column within a main query, но я подозреваю, что мой недостаток знаний SQL вызвал слишком неопределенный вопрос, потому что ответы не сработали.
Я использую Microsoft SQL 2005.
Вот что у меня есть.

Несколько таблиц с CaseID как ПК, CaseID уникален.
Один стол (tblKIN) с CaseID и ItemNum (AutoInc) как комбинированный PK.
Поскольку каждый человек в базе данных, вероятно, имеет более одного родственника.
Если я запустил следующее, в окне SQL-запросов оно работает.

DECLARE @KINList varchar(1000) 
SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN 
WHERE CaseID = 'xxx' and Address = 'yyy' 
ORDER BY KINRel 
SELECT @KINList 

Это вернет отношение всех людей, которые живут по тому же адресу. результаты выглядят так ...
Отец, племянница, сестра, сын

Теперь для меня проблема в том, как добавить это к основному запросу?
Укороченный к соответствующей информации главный запрос выглядит следующим образом.

SELECT DISTINCT 
c.CaseID, 
c.Name, 
c.Address, 
Relatives=CASE WHEN exists(select k.CaseID from tblKIN k where c.CaseID = k.CaseID) 
    THEN DECLARE @KINList varchar(1000) 
     SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN 
     WHERE CaseID = 'xxx' and Address = 'yyy' 
     ORDER BY KINRel 
     SELECT @KINList 
    ELSE '' 
    END 
FROM tblCase c 
ORDER BY c.CaseID 

Ошибки, которые я получаю, являются.
Сервер: Msg 156, уровень 15, состояние 1, строка 13
Неверный синтаксис рядом с ключевым словом 'DECLARE'.
Сервер: Msg 156, Уровень 15, Состояние 1, Строка 18
Неверный синтаксис рядом с ключевым словом «ELSE».

Я попытался вложить скобки в круглые скобки из DECLARE в конец SELECT @KINList.
Я попытался добавить BEGIN и END в раздел THEN инструкции CASE.
Ничего не работало.

Данные исходной таблицы выглядят примерно так. (периоды добавлены для читаемости)
tblCase
CaseID Имя Адрес
10-001 Джиму ...... 100 Main St.
10-002 Том .... 150 Elm St.
10-003 Abe ..... 200 первый Санкт-

tblKIN
CaseID ItemNum Имя связь Адрес
10-001 00001 Steve ... Сын ........ 100 Main St.
10-002 00002 Джеймс .. Отец .... 150 Elm St.
10-002 00003 Betty .... Племянница ...... 150 Elm St.
10-002 00004 Greta ... Сестра ..... 150 Elm St.
10-002 00005 10-002 00005 Davey..Son ........ 150 Elm St.
10-003 00006 Edgar ... Brother ... 200 1st St.

Если я запустил запрос для CaseID = 10-002, ему необходимо вернуть следующее.
CaseID Название Адрес ....... Родственники
10-002 Том ... 150 Elm St. ..Father, племянница, сестра, сын

Я уверен, что это, вероятно, просто исправить, но Я просто не знаю, как это сделать.
Спасибо за ваше время, и я прошу прощения за вопрос, но я хотел быть ясным.

Спасибо !!!

ответ

0

Когда я сделал что-то подобное, мне пришлось создать скалярную функцию для выполнения объединения, которое возвращает результат varchar. Затем просто вызовите его в списке.

CREATE FUNCTION GetRelatives 
(
    @CaseID varchar(10) 
) 
RETURNS varchar(1000) 
AS 
BEGIN 

    DECLARE @KINList varchar(1000) 
    SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN 
     WHERE CaseID = @CaseID 
    ORDER BY KINRel 

    RETURN @KINList 

END 

Тогда ваш выбор

SELECT DISTINCT 
c.CaseID, 
c.Name, 
c.Address, 
database.dbo.GetRelatives(c.CaseID) AS Relatives 
FROM tblCase c 
ORDER BY c.CaseID 
+0

работал отлично !!!!!! Благодаря !!!!! – Scottster

0

Вы можете создать FUNCTION, который принимает в качестве аргумента caseID и возвращает true или false.

Поскольку вы вызываете вложенный запрос несколько раз, это определенно поражает производительность. Лучшим решением является выполнение запроса и сохранение результатов во временной таблице. Затем передайте эту временную таблицу и caseID на номер FUNCTION и проверьте наличие сдерживания.

Смежные вопросы