我需要使用“近匹配”进行 JOIN。解释这一点的最好方法是举个例子:
CREATE TABLE Car
(
Vin int,
Make nvarchar(50),
ColorID int,
)
CREATE TABLE Color
(
ColorID int,
ColorCode nvarchar(10)
)
CREATE TABLE ColorName
(
ColorID int,
Languagecode varchar(12),
ColorName nvarchar(50)
)
INSERT INTO Color Values (1, 'RED CODE')
INSERT INTO Color Values (2, 'GREEN CODE')
INSERT INTO Color Values (3, 'BLUE CODE')
INSERT INTO ColorName Values (1, 'en', 'Red')
INSERT INTO ColorName Values (1, 'en-US', 'Red, my friend')
INSERT INTO ColorName Values (1, 'en-GB', 'Red, my dear')
INSERT INTO ColorName Values (1, 'en-AU', 'Red, mate')
INSERT INTO ColorName Values (1, 'fr', 'Rouge')
INSERT INTO ColorName Values (1, 'fr-BE', 'Rouge, mon ami')
INSERT INTO ColorName Values (1, 'fr-CA', 'Rouge, mon chum')
INSERT INTO Car Values (123, 'Honda', 1)
SPROC 看起来像这样:
DECLARE @LanguageCode varchar(12) = 'en-US'
SELECT * FROM Car A
JOIN Color B ON (A.ColorID = B.ColorID)
LEFT JOIN ColorName C ON (B.ColorID = C.ColorID AND C.LanguageCode = @LanguageCode)
请参阅http://sqlfiddle.com/#!6/ac24d/24(感谢杰克!)
这是挑战:当 SPROC 参数 @LanguageCode 完全匹配时,一切都很好。
我希望它也适用于部分匹配;更具体地说:例如说@LanguageCode 将是“en-NZ”,那么我希望 SPROC 返回语言代码“en”的值(因为“en-NZ”没有值)。
作为一个额外的挑战:如果根本没有匹配,我想返回“en”值;例如,如果@LanguageCode 为“es”,则 SPROC 将返回“en”值(因为“es”没有值)。