سؤال

أحتاج إلى إنشاء عرض من عدة جداول. يجب أن يتكون أحد الأعمدة في العرض من عدد من الصفوف من أحد الجدول كسلسلة ذات قيم مفصولة بفاصلة.

إليك مثال مبسط لما أريد القيام به.

Customers:
CustomerId int
CustomerName VARCHAR(100)

Orders:
CustomerId int
OrderName VARCHAR(100)

هناك علاقة فردية بين العميل والأوامر. لذلك بالنظر إلى هذه البيانات

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 للقيام بذلك في استعلام واحد دون استخدام بروك مخزنة:

 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