Запрос, который возвращает разделенный запятыми список и позволяет искать внутри него - PullRequest
0 голосов
/ 23 августа 2011

У меня есть MainTable с 2 полями: MAIN_ID и DESCRIPTION и SeoncdaryTable с 2 полями: MAIN_ID (FK до MainTable) и EXTRA_INFO.

Я хотел бы получить запрос, который возвращает одну запись на MainTable запись (select * from MainTable), плюс еще один результат, который показывает мне через запятую все записи SecondaryTable (конечно, совпадение с MAIN_ID ).

Более того, я бы хотел, чтобы в условии WHERE можно было фильтровать поля SecondaryTable.

Пример: * * один тысяча двадцать-одна

MainTable

MAIN_ID, DESCRIPTION

1, Один

2, Два

3, Три

4, четыре

Вторичная таблица

MAIN_ID; EXTRA_INFO;

1; АЛЬФА

1; BETA

* +1045 * 1; GAMMA * * 3 тысяча сорок-семь; BETA * * 4 тысячи сорок-девять; ALPHA * +1051 * 4; GAMMA

и я хочу запросить все записи, где вторичная таблица содержит GAMMA, ожидаемые результаты:

* +1055 * 1; Один; АЛЬФА, БЕТА, ГАММА

4, четыре; АЛЬФА, ГАММА

как этого добиться?

Ответы [ 2 ]

3 голосов
/ 23 августа 2011
declare @MainTable table (MAIN_ID int identity, [DESCRIPTION] varchar(10));
insert into @MainTable values('One'),('Two'),('Three'),('Four'),('Five');

declare @SecondaryTable table (MAIN_ID int, EXTRA_INFO varchar(10));
insert into @SecondaryTable values
(1, 'ALPHA'), (1, 'BETA'), (1, 'GAMMA'), (3, 'BETA'), (4, 'ALPHA'), (4, 'GAMMA');

select MT.MAIN_ID,
       MT.[DESCRIPTION],
       stuff((select ', '+ST.EXTRA_INFO
              from @SecondaryTable as ST
              where MT.MAIN_ID = ST.MAIN_ID
              for xml path(''), type).value('.', 'varchar(max)'), 1, 2, '') as EXTRA_INFO
from @MainTable as MT
where MT.MAIN_ID in (select MAIN_ID      
                     from @SecondaryTable
                     where EXTRA_INFO = 'GAMMA')
0 голосов
/ 23 августа 2011

Если вы пытались использовать STUFF, эта команда объединяет все строки результатов в один столбец, здесь вы можете указать разделитель по вашему выбору.

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