Итак, у меня есть структура таблицы в SQL Server 2005, которая имеет следующие составные первичные ключи:
Id int
Culture char(5)
(например, en-США, en-GB и т. Д. ...) Created datetime
Таблица User
имеет столбцы PrimaryCulture
и SecondaryCulture
, представляющие языковые предпочтения пользователей.Таблица Application
содержит один столбец Culture
, представляющий язык по умолчанию для приложения.
Я хочу заявление, которое даст мне последние версии одного из выбранных пользователем языков, если таковые имеются, и приложения.по умолчанию, если нет.Я думаю в соответствии с вложенными COALESCE
утверждениями, например: COALESCE(CulturePrimary, COALESCE(CultureSecondary, CultureDefault))
.
Это то, что я пробовал до сих пор (это не работает, но я не понимаю, почему нет):
SELECT
d.Id,
COALESCE(p.Title, COALESCE(s.Title, d.Title)) Title,
COALESCE(p.[Description], COALESCE(s.[Description], d.[Description])) [Description]
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY Created DESC) Row,
Id,
Title,
[Description]
FROM Project WHERE Culture = 'en-US') d --DefaultCulture
LEFT OUTER JOIN (
SELECT
ROW_NUMBER() OVER (ORDER BY Created DESC) Row,
Id,
Title,
[Description]
FROM Project WHERE Culture = 'en-AU') p --PrimaryCulture
ON p.Id = d.Id
LEFT OUTER JOIN (
SELECT
ROW_NUMBER() OVER (ORDER BY Created DESC) Row,
Id,
Title,
[Description]
FROM Project WHERE Culture = 'en-GB') s --SecondaryCulture
ON s.Id = d.Id
WHERE d.Row = 1
AND p.Row = 1
AND s.Row = 1
ОБНОВЛЕНИЕ:
Так что, спасибо @Martin, проблема заключалась в заключительном предложении WHERE.Вот решение:
SELECT
x.Id,
COALESCE(p.Title, s.Title, d.Title) Title,
COALESCE(p.Description, s.Description, d.Description) [Description],
COALESCE(p.Culture, s.Culture, d.Culture) Culture
FROM (SELECT DISTINCT Id FROM Project) x
LEFT OUTER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY Created DESC) Row, Id, Title, [Description], Culture
FROM Project WHERE Culture = 'en-US') d ON d.Id = x.Id AND d.Row = 1 --DefaultCulture
LEFT OUTER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY Created DESC) Row, Id, Title, [Description], Culture
FROM Project WHERE Culture = 'en-AU') p ON p.Id = x.Id AND p.Row = 1 --PrimaryCulture
LEFT OUTER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY Created DESC) Row, Id, Title, [Description], Culture
FROM Project WHERE Culture = 'en-GB') s ON s.Id = x.Id AND s.Row = 1 --SecondaryCulture