You need to make this setting of one temporary table (if you do not want to use a number table, see an alternative solution below):
SELECT TOP 10000 IDENTITY(int,1,1) AS Number INTO Numbers FROM sys.columns s1 CROSS JOIN sys.columns s2 ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
Once the Numbers table is configured, use this query:
DECLARE @ParentTable table (ID int,Name varchar(20)) DECLARE @ChildTable table (ID int,ParentID int,Name varchar(20)) INSERT INTO @ParentTable VALUES (1,'Bob') INSERT INTO @ChildTable VALUES (1,1,'Jim') INSERT INTO @ChildTable VALUES (2,1,'Ned') SELECT DISTINCT dt.Name,c.Name FROM (SELECT CASE WHEN n.Number=1 THEN NULL ELSE p.ID END AS ID,p.Name FROM @ParentTable p INNER JOIN Numbers n ON 1=1 WHERE p.ID=1 AND n.Number<=2 ) dt LEFT OUTER JOIN @ChildTable c ON dt.ID=c.ParentID ORDER BY 1,2
OUTPUT:
Name Name -------------------- -------------------- Bob NULL Bob Jim Bob Ned (3 row(s) affected)
alternative solution , if you do not want to create a Numbers table, you can use this method, it returns the same result as above:
SELECT DISTINCT dt.Name,c.Name FROM (SELECT CASE WHEN n.Number=1 THEN NULL ELSE p.ID END AS ID,p.Name FROM @ParentTable p INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY object_id) AS Number FROM sys.columns) n ON n.Number<=2 WHERE p.ID=1 AND n.Number<=2 ) dt LEFT OUTER JOIN @ChildTable c ON dt.ID=c.ParentID ORDER BY 1,2
I tried to use CTE to expand the parent line, but this is difficult without using UNION!