10

次のテーブルとサンプル データがあるとします。

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 |

私が考えているクエリ(SQL Serverでは機能しません)は次のようなものです:

-- 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;

これは、関連データを最小限の重複で取得する方法を考えようとしているため、概念的な質問にすぎません (joinたとえば、 で起こることとは対照的です)。

ここでSQLフィドル。

アップデート

この回答から、Oracleがカーソル式でサポートしていることがわかりました:

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

1 に答える 1

12

いいえ、これは実際には不可能です。

SQL Server はネストされたリレーションとNF²をサポートしていません

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>

これは親を繰り返さないOrders

于 2013-04-01T17:46:25.590 に答える