我正在尝试用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);
}
}
我是否完全忽略了我的基础知识,还是 将其分解为多个查询?
谢谢!
答案 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