質問

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

これが私がやりたいことの簡略化された例です。

Customers:
CustomerId int
CustomerName VARCHAR(100)

Orders:
CustomerId int
OrderName VARCHAR(100)

顧客と注文の間には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
役に立ちましたか?

解決

編集: :ビューの作成を含む修正された回答。

/* 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

他のヒント

SQL Server 2008では、XMLが追加されたいくつかの機能を利用して、保存されたProcを使用せずに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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top