Sql 设置可以通过返回的对象访问的。我想知道这是否是ADO.NET的一个功能,而不是数据库。您可能想查看CAST(MULTISET…)不,这不是我的意思,因为如果我从“Orders”返回所有列,那么它们都将在结果中重复。我是说有一个一对一的订单行,但是对于每个订

Sql 设置可以通过返回的对象访问的。我想知道这是否是ADO.NET的一个功能,而不是数据库。您可能想查看CAST(MULTISET…)不,这不是我的意思,因为如果我从“Orders”返回所有列,那么它们都将在结果中重复。我是说有一个一对一的订单行,但是对于每个订,sql,oracle,plsql,Sql,Oracle,Plsql,设置可以通过返回的对象访问的。我想知道这是否是ADO.NET的一个功能,而不是数据库。您可能想查看CAST(MULTISET…)不,这不是我的意思,因为如果我从“Orders”返回所有列,那么它们都将在结果中重复。我是说有一个一对一的订单行,但是对于每个订单行,都有一个嵌套的结果集,其中只包含该订单中的产品。有意义吗?我又加了一些信息。请看一看。澄清一下,订单将只有一行,但实际上您将得到第二个(嵌套)光标,其中有三行用于产品。所以把它想象成一个光标用于父行,然后第二个光标用于每个父行的嵌套行。(


设置可以通过返回的对象访问的。我想知道这是否是ADO.NET的一个功能,而不是数据库。您可能想查看CAST(MULTISET…)不,这不是我的意思,因为如果我从“Orders”返回所有列,那么它们都将在结果中重复。我是说有一个一对一的订单行,但是对于每个订单行,都有一个嵌套的结果集,其中只包含该订单中的产品。有意义吗?我又加了一些信息。请看一看。澄清一下,订单将只有一行,但实际上您将得到第二个(嵌套)光标,其中有三行用于产品。所以把它想象成一个光标用于父行,然后第二个光标用于每个父行的嵌套行。(对不起,我必须脱机。我明天可能会回来)。嘿。。。看起来它可能朝着正确的方向前进,但是您是否可以编辑您的答案,只显示SQL本身,而不是行号/提示等。?这应该更清楚。而且,这看起来像是输出到终端。返回的结果是什么样子的?你如何迭代它们?是的,肯定不是一批中有多个记录者。这显然是在“父”行中导航,然后给您子行。也许正如你所说,这是数据成形,但即便如此,还是需要填充这些结果集,不是吗?重点是我记得这是对数据库的一次调用,所以如果您有1000个父行,每个都返回5个子行,那么这不是1001次调用。这是一个返回1000行的调用,当您遍历每个行时,您可以得到该父行的“子”行。你有一个例子吗?更好的是,你有电话吗?Lorle你的链接。。。“常规SQL允许您使用联接语法检索数据,但这可能是低效和笨拙的,因为冗余的父数据在每个记录中重复[…]数据整形可以将父记录集中的单个父记录与子记录集中的多个子记录相关联,从而避免联接的冗余。”没错!这就是我记得的。那么形状是客户端访问层上的东西,而不是SQL Server?无法在Transact-SQL中直接执行形状?也许这就是我错误地记住的SQL Server的一项功能。很抱歉编辑了您的答案,但我试图在此处显示代码,但注释将其损坏,因此我编辑了您的答案,以便将其粘贴到此处。我的密码有错吗?这是一个错误。(正如我在那里所说的,一旦你看了,请随时删除/还原你的答案。)@MarkA.Donohoe我目前没有Oracle的本地实例来测试游标表达式。在Oracle的LiveSQL上尝试它会产生不同的错误(可能与显示输出有关,而不是查询中的错误,但是很难调试什么是接口问题,什么是查询中的错误),dbfiddle不会运行该表达式。我以前在JDBC中使用过游标表达式。我添加了另一个使用集合和对象类型的示例(同样,Java和JDBC肯定支持它)。
with 
-- sample data
orders (id, name) as
  (select 1, 'Order 1' from dual union all
   select 2, 'Order 2' from dual 
  ),
products (id, name) as
  (select 200, 'apple' from dual union all
   select 201, 'orange' from dual union all
   select 202, 'car' from dual union all
   select 203, 'airplane' from dual
  ),
orderedproducts (orders_id, products_id) as
  (select 1, 202 from dual union all
   select 2, 201 from dual union all
   select 2, 202 from dual union all
   select 2, 203 from dual
  )
-- query you need (I think)  
select o.id oid, o.name oname, p.id, p.name
from orders o join orderedproducts op on op.orders_id = o.id
              join products p on p.id = op.products_id
where 
  -- get everything for order ID = 2
  o.id = 2
order by o.id, p.id;

        ID NAME            ID NAME
---------- ------- ---------- --------
         2 Order 2        201 orange
         2 Order 2        202 car
         2 Order 2        203 airplane
SQL> break on oid on oname
SQL>
SQL> with
  2  -- sample data
  3  orders (id, name) as
  4    (select 1, 'Order 1' from dual union all
<snip>
 23  where
 24    -- get everything for order ID = 2
 25    o.id = 2
 26  order by o.id, p.id;

       OID ONAME           ID NAME
---------- ------- ---------- --------
         2 Order 2        201 orange
                          202 car
                          203 airplane

SQL>
select * from orders where id = @id
select * from order_details where order_id = @id
ORDER_ID | PRODUCTS -------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 | <Products><Product><ProductID>202</ProductID><ProductName>car</ProductName></Product></Products> 2 | <Products><Product><ProductID>201</ProductID><ProductName>orange</ProductName></Product><Product><ProductID>202</ProductID><ProductName>car</ProductName></Product><Product><ProductID>203</ProductID><ProductName>airplane</ProductName></Product></Products> ORDER_ID | PRODUCTS -------: | :-------------------------------------------------------------------------------- 1 | [{"id":202,"name":"car"}] 2 | [{"id":201,"name":"orange"},{"id":202,"name":"car"},{"id":203,"name":"airplane"}]