You can still use a FULL JOIN, just use ISNULL
on the second join condition:
SELECT RowNumber = COALESCE(t.RowNumber, e.RowNumber, d.RowNumber),
EmployeeID = COALESCE(t.EmployeeID, e.EmployeeID, d.EmployeeID),
t.FirstName,
t.MiddleName,
t.LastName,
t.SSN,
t.EmployeeCode,
t.TaxName,
t.Amount,
t.GrossPay,
t.CompanyId,
e.EarningDescription,
EarningAmount = e.Amount,
d.DeductionDescription,
DeductionAmount = d.Amount
FROM @Tax t
FULL JOIN @Earnings e
ON t.EmployeeID = e.EmployeeID
AND t.RowNumber = e.RowNumber
FULL JOIN @Deductions D
ON d.EmployeeID = ISNULL(t.EmployeeID, e.EmployeeID)
AND d.RowNumber = ISNULL(t.RowNumber, e.RowNumber);
Working example below (all columns other than those needed for joins are null though
DECLARE @Tax Table
(
RowNumber int ,
FirstName nvarchar(50),
MiddleName nvarchar(50),
LastName nvarchar(50),
SSN nvarchar(50),
EmployeeCode nvarchar(50),
TaxName nvarchar(50),
Amount decimal(18,2),
GrossPay decimal(18,2),
CompanyId int,
EmployeeId int
)
INSERT @Tax (RowNumber, EmployeeID)
VALUES (1, 1), (2, 1), (3, 1), (4, 1);
DECLARE @Earnings TABLE
(
RowNumber int ,
EmployeeId int,
EarningDescription nvarchar(50),
Amount decimal(18,2)
)
INSERT @Earnings (RowNumber, EmployeeID)
VALUES (1, 1), (2, 1);
DECLARE @Deductions TABLE
(
RowNumber int ,
EmployeeId int,
DeductionDescription nvarchar(50),
Amount decimal(18,2)
)
INSERT @Deductions (RowNumber, EmployeeID)
VALUES (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1);
SELECT RowNumber = COALESCE(t.RowNumber, e.RowNumber, d.RowNumber),
EmployeeID = COALESCE(t.EmployeeID, e.EmployeeID, d.EmployeeID),
t.FirstName,
t.MiddleName,
t.LastName,
t.SSN,
t.EmployeeCode,
t.TaxName,
t.Amount,
t.GrossPay,
t.CompanyId,
e.EarningDescription,
EarningAmount = e.Amount,
d.DeductionDescription,
DeductionAmount = d.Amount
FROM @Tax t
FULL JOIN @Earnings e
ON t.EmployeeID = e.EmployeeID
AND t.RowNumber = e.RowNumber
FULL JOIN @Deductions D
ON d.EmployeeID = ISNULL(t.EmployeeID, e.EmployeeID)
AND d.RowNumber = ISNULL(t.RowNumber, e.RowNumber);