Вложенный оператор SELECT в выражении CASE - PullRequest
1 голос
/ 14 декабря 2010

Привет,

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

Я уже разместил похожеевопрос здесь. Возврат нескольких значений в одном столбце в основном запросе , но я подозреваю, что мое отсутствие знаний SQL сделало вопрос слишком расплывчатым, поскольку ответы не работали.
Я использую Microsoft SQL 2005.
Здесьэто то, что у меня есть.

Несколько таблиц с CaseID в качестве PK, 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 Вязов ул.
10-003 Абэ ..... 200 1-й ул.

tblKIN
CaseID ItemNum Name Адрес для связи
10-001 00001 Стив...Son ........ 100 Main St.
10-002 00002 Джеймс .. Отец .... 150 Elm St.
10-002 00003 Бетти .... Племянница ...... 150 Elm St.
10-002 00004 Грета ... Сестра ..... 150 Elm St.
10-002 00005 Davey..Son ........ 150 Elm St.
10-003 00006 Эдгар ... Брат ... 200 1-й ул.

Если я запускаю запрос для CaseID = 10-002, он должен вернуть следующее.
Имя CaseIDАдрес ....... Родственники
10-002 Том ... ул. Вязов 150 .. Отец, племянница, сестра, сын

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

Спасибо !!!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2010

Когда я делал нечто подобное, мне нужно было создать скалярную функцию для объединения, которое возвращает результат 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 голосов
/ 14 декабря 2010

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

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

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