我有一个代表Object
. 它有许多列,但也有需要语言支持的字段。
为简单起见,假设我有 3 个表:
- 主对象表
- LanguageDependantField1
- LanguageDependantField2。
MainObjectTable
有一个名为 的 PK int ID
,并且两者LanguageDependantTables
都有一个指向 的外键链接MainObjectTable
以及语言代码和添加日期。
我创建了一个接受 MainObjectTable ID 和Language
. 它将返回包含语言表中最新项目的单行。选择语句看起来像
SELECT
MainObjectTable.VariousColumns,
LanguageDependantField1.Description,
LanguageDependantField2.SomeOtherText
FROM
MainObjectTable
OUTER APPLY
(SELECT TOP 1 LanguageDependantField1.Description
FROM LanguageDependantField1
WHERE LanguageDependantField1.MainObjectTable_ID = MainObjectTable.ID
AND LanguageDependantField1.Language_ID = @language
ORDER BY
LanguageDependantField1.[Default], LanguageDependantField1.CreatedDate DESC) LanguageDependantField1
OUTER APPLY
(SELECT TOP 1 LanguageDependantField2.SomeOtherText
FROM LanguageDependantField2
WHERE LanguageDependantField2.MainObjectTable_ID = MainObjectTable.ID
AND LanguageDependantField2.Language_ID = @language
ORDER BY
LanguageDependantField2.[Default] DESC, LanguageDependantField2.CreatedDate DESC) LanguageDependantField2
WHERE
MainObjectTable.ID = @MainObjectTableID
我要添加的是,如果在指定语言中找不到行,则能够回退到默认语言。假设我们使用“德语”作为所选语言。LanguageDependantField1
如果假设我们有德语不存在,是否可以返回英语行@fallbackLanguageID
我也可以OUTER APPLY
在这种情况下使用还是应该使用JOIN
?
非常感谢您的帮助。