9

複数のテーブルからビューを作成する必要があります。ビュー内の列の 1 つは、カンマ区切りの値を持つ文字列として、テーブルの 1 つからの多数の行から構成される必要があります。

これは、私がやりたいことの簡単な例です。

Customers:
CustomerId int
CustomerName VARCHAR(100)

Orders:
CustomerId int
OrderName VARCHAR(100)

Customer と Orders の間には 1 対多の関係があります。したがって、このデータを考えると

Customers
1 'John'
2 'Marry'

Orders
1 'New Hat'
1 'New Book'
1 'New Phone'

ビューを次のようにしたい:

Name     Orders
'John'   New Hat, New Book, New Phone
'Marry'  NULL

注文があるかどうかに関係なく、全員がテーブルに表示されるようにします。

このビューに変換する必要があるストアド プロシージャがありますが、ビュー内でパラメータを宣言してストアド プロシージャを呼び出すことはできないようです。このクエリをビューに取り込む方法について何か提案はありますか?

CREATE PROCEDURE getCustomerOrders(@customerId int)
AS
   DECLARE @CustomerName varchar(100)
   DECLARE @Orders varchar (5000)

   SELECT @Orders=COALESCE(@Orders,'') + COALESCE(OrderName,'') + ',' 
   FROM Orders WHERE CustomerId=@customerId

   -- this has to be done separately in case orders returns NULL, so no customers are excluded
   SELECT @CustomerName=CustomerName FROM Customers WHERE CustomerId=@customerId

   SELECT @CustomerName as CustomerName, @Orders as Orders
4

2 に答える 2

9

編集:ビューの作成を含むように回答を変更しました。

/* Set up sample data */
create table Customers (
    CustomerId int,
    CustomerName VARCHAR(100)
)

create table Orders (
    CustomerId int,
    OrderName VARCHAR(100)
)

insert into Customers
    (CustomerId, CustomerName)
    select 1, 'John' union all
    select 2, 'Marry'

insert into Orders
    (CustomerId, OrderName)
    select 1, 'New Hat' union all
    select 1, 'New Book' union all
    select 1, 'New Phone'
go

/* Create the view */       
create view OrderView as    
    select c.CustomerName, x.OrderNames
        from Customers c
            cross apply (select stuff((select ',' + OrderName from Orders o where o.CustomerId = c.CustomerId for xml path('')),1,1,'') as OrderNames) x
go

/* Demo the view */
select * from OrderView
go 

/* Clean up after demo */
drop view OrderView
drop table Customers
drop table Orders
go
于 2010-11-02T20:49:01.313 に答える
6

SQL Server 2008では、XMLに追加された機能の一部を利用して、ストアドプロシージャを使用せずに、これをすべて1つのクエリで実行できます。

 SELECT CustomerName,
    STUFF( -- "STUFF" deletes the leading ', '
        ( SELECT ', ' + OrderName
        FROM Orders
        WHERE CustomerId = Customers.CutomerId
        -- This causes the sub-select to be returned as a concatenated string
        FOR XML PATH('') 
        ),
    1, 2, '' )
    AS Orders
 FROM Customers
于 2010-11-02T20:49:40.243 に答える