There are probably better ways, but here is a quick and dirty way to do it: DECLARE @TableA TABLE (ID INT, AVal VARCHAR(10))DECLARE @TableB TABLE (Key1 INT, Key2 INT, BVal VARCHAR(10))INSERT @TableASELECT 1, 'Foo'UNION ALL SELECT 2, 'Bar'UNION ALL SELECT 3, 'Lost'UNION ALL SELECT 4, 'Yak'INSERT @TableBSELECT 1, 3, 'Harpo'UNION ALL SELECT 99, 3, 'Zeppo'UNION ALL SELECT 4, 12, 'Groucho'SELECT *FROM @TableA AS ALEFT OUTER JOIN ( SELECT KeyID, BVal, ROW_NUMBER() OVER(PARTITION BY KeyID ORDER BY KeyID, Part) AS RowNum FROM ( SELECT DISTINCT 1 AS Part, Key1 AS KeyID, BVal FROM @TableB UNION ALL SELECT DISTINCT 2 AS Part, Key2 AS KeyID, BVal FROM @TableB ) AS Temp ) AS B ON A.ID = B.KeyID AND RowNum = 1