从子查询中选择多个结果为单行(作为数组数据类型)

时间:2015-02-05 22:26:19

标签: sql oracle

我正在尝试用oracle数据库中的SQL查询解决一个小问题。我们假设我有这些表:

一张包含汽车信息的表格:

tblCars
ID    Model    Color
--------------------
1     Volvo    Red
2     BMW      Blue
3     BMW      Green

另一个包含有关驱动程序的信息:

tblDrivers
ID    fID_tblCars    Name
---------------------------
1     1              George
2     1              Mike
3     2              Jason
4     2              Paul
5     2              William
6     3              Steve

现在,让我们假装找出汽车的受欢迎程度,我想创建包含汽车汽车数据的报告(这似乎是非常合理的事情)一个人可以用数据库完成。)

此“ReportObject”将包含模型的字符串,颜色的字符串以及驱动程序的字符串数组(或列表)。

目前,我通过两个查询执行此操作,首先是我选择汽车

SELECT ID, Model, Color FROM tblCars

并为每个结果创建一个报告对象。

然后,我将采取每个结果并获得每辆特定车的司机

SELECT Name FROM tblDrivers WHERE fID_tblCars = ResultObject.ID

基本上,第一步给出了一个结果数据集,如下所示:

Result
------------------------------------------
ColumnID        ColumnModel    ColumnColor
Type Integer    Type String    Type String

现在,如果将来我将拥有更多汽车,我将不得不进行大量额外查询,每个查询对应结果表中的每一行。

当我尝试这个时:

SELECT Model, Color, (SELECT Name FROM tblDrivers WHERE tblDrivers.fID_tblCars = tblCars.ID) as Name FROM tblCars

我收到一些错误消息,告诉我行中的一个结果包含多个元素(这就是我想要的!)。

我希望结果看起来像这样:

Result
--------------------------------------------------------
ColumnID        ColumnModel    ColumnColor    ColumnName
Type Integer    Type String    Type String    Type Array

因此,当我构建报表对象时,我可以这样做:

foreach (var Row in Results)
{
    ReportObject.Model = Row.Model;
    ReportObject.Color = Row.Color;
    foreach (string Driver in Row.Name)
    {
        ReportObject.Drivers.Add(Driver);
    }
}

我是否完全忽略了我的基础知识,还是 将其分解为多个查询?

谢谢!

1 个答案:

答案 0 :(得分:2)

这适用于Oracle。在SQL Fiddle示例中,我无法在创建表时使用IDENTITY或PRIMARY KEYS(之前从未使用过Oracle SQL)

SELECT  c.id, 
    c.model, 
    c.color,
    LISTAGG(d.name, ',') WITHIN GROUP (ORDER BY d.name) AS "Drivers"
FROM tblCars c
JOIN tblDrivers d
ON c.id = d.fID_TblCars
GROUP BY c.id,
    c.model,
    c.color
ORDER BY c.Id

SQL Fiddle Example