2012-06-21 3 views
2

У меня есть visitor таблицу, которая выглядит следующим образом:Как вернуть несколько результатов в подзапрос?

VID Name  Address  DOB 
001 Bob  101 St   03/05/2001 
002 James  505 Rd   02/06/1985 
003 Jill  201 Place  04/06/1970 

И в visits таблицу, которая выглядит следующим образом:

VID Date   Reason 
001 05/07/2012 Family 
001 06/01/2012 Family 
003 03/02/2011 Other 

Я хочу сделать запрос с соединением между этими двумя на VID (который я уже сделал), но также имеет запрос показать все (несколько) результатов от посещений. Таким образом, результаты будут выглядеть так:

Name   DOB    Visits 
Bob   03/05/2001  05/07/2012 Family, 06/01/2012 Family 
James  02/06/1985 
Jill   04/06/1970  03/02/2011 Other 

Возможно ли это? Я попытался выполнить такой подзапрос, как:

SELECT Название, DOB, (SELECT Дата, причина FROM посещений AS H WHERE H.VID = visitor.VID) В качестве посещений FROM visitor;

Но это дало мне очевидное Subquery returned more than 1 value Ошибка. Данные будут обрабатываться PHP, но я надеялся выполнить это в одном запросе.

+0

Какую версию sql-сервера вы используете? –

+0

@Lieven 2008 R2, добавленный к моему вопросу. – JBurace

+0

В отличие от де-номинализации конкретного поля, другой вариант заключается в том, чтобы * сгладить * весь набор результатов, а затем сгруппировать КЛЮЧ. (Будет 6 записей здесь.) –

ответ

4

Вы можете использовать FOR XML PATH конструкцию, чтобы сцепить свои результаты в одну колонку

SELECT Name 
     , DOB 
     , STUFF((SELECT ', ' 
         + CONVERT(VARCHAR(16), H.Date, 101) 
         + ' ' 
         + H.Reason 
        FROM visits AS H 
        WHERE H.VID = visitor.VID 
        FOR XML PATH('')), 1, 2, '') 
FROM  visitor; 

Обратите внимание, что различные форматы даты поддерживаются с обращенным. Я использовал 101 в примере, который переводится в mm/dd/yyyy.

Посмотрите на MSDN для всех стилей, поддерживаемых конвертированием.

+0

Как насчет даты? Будет ли это 'Date + ',' + H.Reason'? Date - DateTime obj или сортировка. – JBurace

+0

@JBurace. Вам нужно будет указать дату в строку, используя CONVERT, и соединить это с причиной. Я изменил ответ. –

1

Вам нужно будет присоединиться к двум таблицам, а затем выполнить обработку в php. Таким образом,

SELECT a.Name, a.DOB, b.Date, b.Reason FROM visitor a, посещает b, где a.VID = b.VID order by 1,2;

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

+0

Это немного для «руководства» по моему вкусу (я бы просто использовал операцию группировки), но он избегает де-нормализации столбца. Плоский результирующий набор может быстро стать «непомерно большим» для главных объединений, однако .. –

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