如何在子查询中返回多个结果?

时间:2012-06-21 18:06:43

标签: sql-server sql-server-2008-r2 subquery

我有一个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 Name,DOB,(选择日期,原因FROM访问AS H WHERE H.VID = visitor.VID)作为来访者访问;

但这给了我明显的Subquery returned more than 1 value错误。数据将由PHP解析,但我希望在一个查询中完成此任务。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你必须加入这两个表,然后在php中进行处理。所以

选择a.Name,a.DOB,b.Date,b.Reason FROM visitor a,访问b,其中a.VID = b.VID顺序为1,2;

然后,您只需要遍历记录并在前两列中的一列发生变化时开始一个新行。