Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql select语句可以包含嵌套的结果集吗?_Sql_Sql Server - Fatal编程技术网

Sql select语句可以包含嵌套的结果集吗?

Sql select语句可以包含嵌套的结果集吗?,sql,sql-server,Sql,Sql Server,给出以下表格和样本数据: create table Orders ( ID int not null primary key, Customer nvarchar(100) not null); create table OrderItems ( ID int not null primary key, OrderID int not null foreign key references Orders(ID), Product nvarchar(100) not nul

给出以下表格和样本数据:

create table Orders (
  ID int not null primary key, 
  Customer nvarchar(100) not null);

create table OrderItems (
  ID int not null primary key,
  OrderID int not null foreign key references Orders(ID),
  Product nvarchar(100) not null);

insert into Orders values (1, 'John');
insert into Orders values (2, 'James');
insert into OrderItems values (1, 1, 'Guitar');
insert into OrderItems values (2, 1, 'Bass');
insert into OrderItems values (3, 2, 'Guitar');
insert into OrderItems values (4, 2, 'Drums');
我想知道是否可以查询父
Orders
表,并将子
OrderItems
表作为父结果中的嵌套结果集获取。大概是这样的:

| ORDER.ID | ORDER.CUSTOMER | ORDER.ORDERITEMS                   |
------------------------------------------------------------------
|          |                | ORDERITEMS.ID | ORDERITEMS.PRODUCT |
|          |                |-------------------------------------
|        1 |           John |             1 |             Guitar |
|          |                |             2 |               Bass |
|        2 |          James |             3 |             Guitar |
|          |                |             4 |              Drums |
-- doesn't work, but shows the intent to have nested result sets
select 
  o.OrderID [Order.ID], o.Customer [Order.Customer],
  (select 
     oi.ID [OrderItems.ID], oi.Product [OrderItems.Product] 
     from OrderItems oi where o.ID = oi.OrderID
  ) [Order.OrderItems]
from Orders o;
我想到的查询(在SQL Server中不起作用)是这样的:

| ORDER.ID | ORDER.CUSTOMER | ORDER.ORDERITEMS                   |
------------------------------------------------------------------
|          |                | ORDERITEMS.ID | ORDERITEMS.PRODUCT |
|          |                |-------------------------------------
|        1 |           John |             1 |             Guitar |
|          |                |             2 |               Bass |
|        2 |          James |             3 |             Guitar |
|          |                |             4 |              Drums |
-- doesn't work, but shows the intent to have nested result sets
select 
  o.OrderID [Order.ID], o.Customer [Order.Customer],
  (select 
     oi.ID [OrderItems.ID], oi.Product [OrderItems.Product] 
     from OrderItems oi where o.ID = oi.OrderID
  ) [Order.OrderItems]
from Orders o;
这只是一个概念性的问题,因为我正试图想办法以最少的重复来获取相关数据(例如,与
连接发生的情况相反)

SQL小提琴

更新

我发现Oracle支持光标表达式:

select 
  o.*,
  cursor(select oi.* from OrderItems oi where o.ID = oi.OrderID) as OrderItems
from Orders o;

不,这不太可能

SQL Server不支持嵌套关系和

尽管您可以使用
FOR XML PATH
以分层方式将其恢复

SELECT ID       AS [@ID],
       Customer AS [@Customer],
       (SELECT ID      AS [@ID],
               OrderID AS [@OrderID],
               Product AS [@Product]
        FROM   OrderItems
        WHERE  OrderItems.OrderID = o.ID
        FOR XML PATH('OrderItems'), TYPE)
FROM   Orders o
FOR XML PATH('Order'), ROOT('Orders') 
返回

   <Orders>
      <Order ID="1" Customer="John">
        <OrderItems ID="1" OrderID="1" Product="Guitar" />
        <OrderItems ID="2" OrderID="1" Product="Bass" />
      </Order>
      <Order ID="2" Customer="James">
        <OrderItems ID="3" OrderID="2" Product="Guitar" />
        <OrderItems ID="4" OrderID="2" Product="Drums" />
      </Order>
    </Orders>


这不会重复违反关系模型(特别是1NF,属性只包含一个事实的要求)的父级命令。如果需要联接,应该使用联接。即使您让子查询正常工作,它也将是一个相关子查询,比连接慢得多(相关子查询按行运行,本质上是游标,rarley应该出现在生产代码中)。通常,上面显示的格式设置是由应用程序而不是SQL完成的。@HLGEM:格式设置只是为了显示我想要的结果。
join
的“问题”在于它可以传输比需要多得多的数据。假设
Orders
表有200列,每个订单平均有10项…@Oded:我不是建议改变模型本身,只是改变它的查询方式…你不需要;在联接中不必返回比所需更多的列,事实上,不应使用select*,而应只指定所需的列。