Để cung cấp cho bạn một minh họa về việc tham gia (trong trường hợp này là tự tham gia, nhưng tất cả các liên kết đều hoạt động) và sử dụng STUFF cho việc này. Lưu ý mệnh đề WHERE bên trong STUFF. Đây là những gì liên kết bản ghi với các giá trị chính xác.
declare @test table
(
email varchar(50),
address varchar(50)
)
insert into @test VALUES
('[email protected]','A123A'),
('[email protected]','AB263'),
('[email protected]','45632A'),
('[email protected]','78YU'),
('[email protected]','6543D')
SELECT DISTINCT
email,
Stuff((SELECT ', ' + address
FROM @test t2
WHERE t2.email = t1.email
FOR XML PATH('')), 1, 2, '') Address
FROM @test t1
Chỉnh sửa
OK, những gì bạn muốn (những gì bạn thực sự, thực sự muốn) là:
declare @customers table
(
emailaddress varchar(50),
customerid int
)
insert into @customers VALUES
('[email protected]',1),
('[email protected]',2)
declare @orders table
(
orderid int,
customerid int,
orderdate date
)
insert into @orders VALUES
(1, 1, '2017-06-02'),
(2, 1, '2017-06-05'),
(3, 1, '2017-07-13'),
(4, 2, '2017-06-13')
declare @orderdetails table
(
id int,
orderid int,
productcode varchar(10)
)
insert into @orderdetails VALUES
(1, 1, 'apple pie'),
(2, 1, 'bread'),
(3, 2, 'custard'),
(4, 2, 'orange'),
(5, 3, 'orange'),
(6, 4, 'orange')
SELECT DISTINCT c.EmailAddress, productcode=
STUFF((SELECT ',' + odc.productcode FROM
(SELECT DISTINCT emailaddress,productcode FROM
@orders o2 inner join @orderdetails od2 on
o2.orderid = od2.orderid
inner join @customers c2 ON c2.customerid = o2.customerid) odc
WHERE odc.emailaddress=c.emailaddress
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM @OrderDetails od
JOIN @Orders o ON od.OrderID = o.OrderID
JOIN @Customers c ON c.CustomerID=o.CustomerID
WHERE o.OrderDate BETWEEN '2016-01-01' AND getdate()
Lưu ý sự thay đổi ở đây. SELECT trong STUFF bây giờ là từ một truy vấn phụ, do đó bạn có thể nhóm theo Địa chỉ Email.
Giải thích bổ sung
Mục đích của bạn là có sự kết hợp của các mã sản phẩm được nhóm theo khách hàng (thể hiện bằng địa chỉ email). Vấn đề là mã sản phẩm nằm trong bảng chi tiết đơn hàng và địa chỉ email nằm trong bảng khách hàng, nhưng không có trường nào liên kết cả hai. Bảng khách hàng có mối quan hệ từ một đến nhiều với bảng đơn hàng và bảng đơn đặt hàng có mối quan hệ một đến nhiều với bảng chi tiết đơn hàng. Đó là một mức độ trừu tượng quá nhiều. Vì vậy, chúng tôi cần trợ giúp cơ sở dữ liệu bằng cách cung cấp liên kết trực tiếp giữa mã sản phẩm và địa chỉ email. Điều này chúng tôi thực hiện thông qua Truy vấn phụ. Tôi hy vọng rằng điều này làm cho nó rõ ràng hơn cho bạn.