SQL выбирает последние версии записей на одном из трех языков в порядке предпочтения - PullRequest
0 голосов
/ 11 октября 2010

Итак, у меня есть структура таблицы в 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

1 Ответ

0 голосов
/ 11 октября 2010

примерно так будет работать:

case 
    when coalesce(p.[Description], s.[Description]) is null then d.[Description]
    else coalesce(p.[Description], s.[Description])
end as [Description]

Редактировать: хммм, второе чтение этого ответа напоминает мне никогда не пытаться sql после долгого дня: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...