1) There are allot of solutions.
2) Example (SQL2005+):
DECLARE @Customer TABLE (
CustomerID INT PRIMARY KEY,
Name NVARCHAR(50) NOT NULL
);
INSERT @Customer VALUES (1, 'Microsoft');
INSERT @Customer VALUES (2, 'Macrosoft');
INSERT @Customer VALUES (3, 'Appl3');
DECLARE @Order TABLE (
OrderID INT PRIMARY KEY,
CustomerID INT NOT NULL -- FK
);
INSERT @Order VALUES (1, 1);
INSERT @Order VALUES (2, 2);
INSERT @Order VALUES (3, 2);
INSERT @Order VALUES (4, 1);
INSERT @Order VALUES (5, 2);
SELECT c.CustomerID, c.Name, oa.OrderNumbers
FROM @Customer AS c
/*CROSS or */OUTER APPLY (
SELECT STUFF((
SELECT ',' + CONVERT(VARCHAR(11), o.OrderID) FROM @Order AS o
WHERE o.CustomerID = c.CustomerID
-- ORDER BY o.OrderID -- Uncomment of order nums must be sorted
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS OrderNumbers
) oa;
Output:
CustomerID Name OrderNumbers
----------- --------- ------------
1 Microsoft 1,4
2 Macrosoft 2,3,5
3 Appl3 NULL