Slightly different approach, only scans each table once
😎
USE tempdb;
GO
SET NOCOUNT ON;
declare @vehicle table(id int, vehiclemake varchar(10), vehiclemodel varchar(10));
declare @vehicleclass table(id int, vehiclemake varchar(10), vehiclemodel varchar(10), classtype varchar(1));
insert into @vehicle values
(1, 'AUDI', 'R8')
,(2, 'AUDI', 'Quattro')
,(3, 'PORCHE', '')
;
insert into @vehicleclass values
(1, 'AUDI', 'R8', 'A')
,(2, 'AUDI', null, 'B')
;
;WITH MATCHED_AND_ORDERED AS
(
SELECT
V.id AS V_id
,V.vehiclemake AS V_vehiclemake
,V.vehiclemodel AS V_vehiclemodel
,VC.id AS VC_id
,VC.vehiclemake AS VC_vehiclemake
,VC.vehiclemodel AS VC_vehiclemodel
,VC.classtype AS VC_classtype
,ROW_NUMBER() OVER
(
PARTITION BY V.id
ORDER BY CASE
WHEN V.vehiclemodel = VC.vehiclemodel THEN 1
WHEN VC.vehiclemodel IS NULL AND V.vehiclemodel IS NOT NULL THEN 2
ELSE 3
END
) AS VC_RID
FROM @vehicle V
LEFT OUTER JOIN @vehicleclass VC
ON V.vehiclemake = VC.vehiclemake
)
SELECT
MAO.V_id
,MAO.V_vehiclemake
,MAO.V_vehiclemodel
,MAO.VC_id
,MAO.VC_vehiclemake
,MAO.VC_vehiclemodel
,MAO.VC_classtype
FROM MATCHED_AND_ORDERED MAO
WHERE MAO.VC_RID = 1;
Results
V_id V_vehiclemake V_vehiclemodel VC_id VC_vehiclemake VC_vehiclemodel VC_classtype
----------- ------------- -------------- ----------- -------------- --------------- ------------
1 AUDI R8 1 AUDI R8 A
2 AUDI Quattro 2 AUDI NULL B
3 PORCHE NULL NULL NULL NULL