Mit COALESCE in SQL-Ansicht
-
28-09-2019 - |
Frage
Ich brauche eine Ansicht aus mehreren Tabellen zu erstellen. Eine der Spalten in der Ansicht wird von einer Anzahl von Zeilen aus einem der Tabelle als String mit kommagetrennte Werte werden müssen zusammengesetzt werden.
Hier ist ein vereinfachtes Beispiel dafür, was ich tun möchte.
Customers:
CustomerId int
CustomerName VARCHAR(100)
Orders:
CustomerId int
OrderName VARCHAR(100)
Es gibt eine Eins-zu-viele-Beziehung zwischen dem Kunden und Bestellungen. So gegeben diese Daten
Customers
1 'John'
2 'Marry'
Orders
1 'New Hat'
1 'New Book'
1 'New Phone'
Ich möchte eine Ansicht so sein:
Name Orders
'John' New Hat, New Book, New Phone
'Marry' NULL
Damit JEDER zeigt in der Tabelle nach oben, und zwar unabhängig davon, ob sie Aufträgen oder nicht.
Ich habe eine gespeicherte Prozedur, dass ich zu dieser Ansicht übersetzen müssen, aber es scheint, dass Sie params erklären kippe und gespeicherte Prozeduren innerhalb einer Ansicht aufrufen. Alle Vorschläge, wie diese Abfrage in eine Ansicht zu bekommen?
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
Lösung
Bearbeiten :. Modifizierte Antwort Schaffung Ansicht einschließen
/* 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
Andere Tipps
In SQL Server 2008 können Sie die Vorteile von einigen der Funktionen hinzugefügt für XML nehmen können dies alles in einer Abfrage zu tun, ohne eine gespeicherte Prozedur mit:
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