Select Table_2.Date, MAX(t1analyst.Name ), MAX( t1j.Name ), MAX(t1acct.Name )From Table_2left join Table_1 t1analyst on Table_2.Analyst_EID = t1analyst.EIDleft join Table_1 t1j on Table_2.Journey_EID = t1j.EIDleft join Table_1 t1acct on Table_2.Accountant_EID = t1acct.EIDgroup by Table_2.DateOrder by Table_2.Date ASC
DECLARE @Table1 TABLE ( EID INT, EmployeeName VARCHAR(32), Title VARCHAR(32), Number CHAR(12));DECLARE @Table2 TABLE ( EmpDate DATE, AnalystEID INT NULL, JourneyEID INT NULL, AccountantEID INT NULL);INSERT INTO @Table1 ( EID, EmployeeName, Title, Number )VALUES ( 1, -- EID - int 'John', -- EmployeeName - varchar(32) 'Analyst', -- Title - varchar(32) 'xxx-xxx-xxxx' -- Number - char(12) ), ( 2, -- EID - int 'Sam', -- EmployeeName - varchar(32) 'Journey Man', -- Title - varchar(32) 'xxx-xxx-xxxx' -- Number - char(12) ), ( 3, -- EID - int 'Sandra', -- EmployeeName - varchar(32) 'Accountant', -- Title - varchar(32) 'xxx-xxx-xxxx' -- Number - char(12) );INSERT INTO @Table2 ( EmpDate , AnalystEID , JourneyEID , AccountantEID )VALUES ( '2012-02-01' , -- EmpDate - date 1 , -- AnalystEID - int 2 , -- JourneyEID - int 3 -- AccountantEID - int ), ( '2012-02-03' , -- EmpDate - date NULL , -- AnalystEID - int 2 , -- JourneyEID - int NULL -- AccountantEID - int ), ( '2012-02-04' , -- EmpDate - date NULL , -- AnalystEID - int NULL , -- JourneyEID - int 3 -- AccountantEID - int ), ( '2012-02-05' , -- EmpDate - date 1 , -- AnalystEID - int 2 , -- JourneyEID - int 3 -- AccountantEID - int );SELECT * FROM @Table1;SELECT * FROM @Table2;SELECT *FROM @Table2 t2 OUTER APPLY (SELECT t1.EmployeeName FROM @Table1 t1 WHERE t1.EID = t2.AnalystEID)dt1(AnalystName) OUTER APPLY (SELECT t1.EmployeeName FROM @Table1 t1 WHERE t1.EID = t2.JourneyEID)dt2(JourneyName) OUTER APPLY (SELECT t1.EmployeeName FROM @Table1 t1 WHERE t1.EID = t2.AccountantEID)dt3(AccountantName);
use tempdbgoCREATE TABLE Table_1 ( EID INT, Name VARCHAR(32), Title VARCHAR(32), Number CHAR(12));CREATE TABLE Table_2 ( Date DATE, Analyst_EID INT NULL, Journey_EID INT NULL, Accountant_EID INT NULL);INSERT INTO Table_1 ( EID, Name, Title, Number )VALUES ( 1, -- EID - int 'John', -- EmployeeName - varchar(32) 'Analyst', -- Title - varchar(32) 'xxx-xxx-xxxx' -- Number - char(12) ), ( 2, -- EID - int 'Sam', -- EmployeeName - varchar(32) 'Journey Man', -- Title - varchar(32) 'xxx-xxx-xxxx' -- Number - char(12) ), ( 3, -- EID - int 'Sandra', -- EmployeeName - varchar(32) 'Accountant', -- Title - varchar(32) 'xxx-xxx-xxxx' -- Number - char(12) );INSERT INTO Table_2 ( Date , Analyst_EID , Journey_EID , Accountant_EID )VALUES ( '2012-02-01' , -- EmpDate - date 1 , -- AnalystEID - int 2 , -- JourneyEID - int 3 -- AccountantEID - int ), ( '2012-02-03' , -- EmpDate - date NULL , -- AnalystEID - int 2 , -- JourneyEID - int NULL -- AccountantEID - int ), ( '2012-02-04' , -- EmpDate - date NULL , -- AnalystEID - int NULL , -- JourneyEID - int 3 -- AccountantEID - int ), ( '2012-02-05' , -- EmpDate - date 1 , -- AnalystEID - int 2 , -- JourneyEID - int 3 -- AccountantEID - int );--SELECT * FROM Table_1;--SELECT * FROM Table_2;Select Table_2.Date, MAX(t1analyst.Name ), MAX( t1j.Name ), MAX(t1acct.Name )From Table_2left join Table_1 t1analyst on Table_2.Analyst_EID = t1analyst.EIDleft join Table_1 t1j on Table_2.Journey_EID = t1j.EIDleft join Table_1 t1acct on Table_2.Accountant_EID = t1acct.EIDgroup by Table_2.DateOrder by Table_2.Date ASCDROP TABLE Table_1;DROP TABLE Table_2;
--============================================================================================================-- Create and populate the test tables. This is NOT a part of the solution.-- I did, however,add the expected PK's which also create indexes.--============================================================================================================DECLARE @Table1 TABLE ( EID INT NOT NULL PRIMARY KEY CLUSTERED, EmployeeName VARCHAR(32) NOT NULL, Title VARCHAR(32) NOT NULL, Number CHAR(12) NOT NULL );DECLARE @Table2 TABLE ( Date DATETIME NOT NULL PRIMARY KEY CLUSTERED, AnalystEID INT NULL, JourneyEID INT NULL, AccountantEID INT NULL ); INSERT INTO @Table1 (EID, EmployeeName, Title, Number) SELECT 1,'John' ,'Analyst' ,'xxx-xxx-xxxx' UNION ALL SELECT 2,'Sam' ,'Journey Man','xxx-xxx-xxxx 'UNION ALL SELECT 3,'Sandra','Accountant' ,'xxx-xxx-xxxx'; INSERT INTO @Table2 (Date, AnalystEID, JourneyEID, AccountantEID) SELECT '2012-02-01', 1 , 2 , 3 UNION ALL SELECT '2012-02-03', NULL, 2 , NULL UNION ALL SELECT '2012-02-04', NULL, NULL, 3 UNION ALL SELECT '2012-02-05', 1 , 2 , 3;--============================================================================================================-- Solve the problem only 1 scan of each table.--============================================================================================================ SELECT Date = CONVERT(CHAR(10),t2.Date,101), AnalystEID = MAX(CASE WHEN ca.AttributeName = 'AnalystEID' THEN t1.EmployeeName ELSE '' END), JourneyEID = MAX(CASE WHEN ca.AttributeName = 'JourneyEID' THEN t1.EmployeeName ELSE '' END), AcccountantEID = MAX(CASE WHEN ca.AttributeName = 'AcccountantEID' THEN t1.EmployeeName ELSE '' END) FROM @Table2 t2 CROSS APPLY (SELECT 'AnalystEID' ,AnalystEID UNION ALL SELECT 'JourneyEID' ,JourneyEID UNION ALL SELECT 'AcccountantEID',AccountantEID) ca (AttributeName,AttributeValue) JOIN @Table1 t1 ON t1.EID = ca.AttributeValue GROUP BY t2.Date ORDER BY t2.Date;