Я предполагаю, что что-то напутано в предоставленных вами данных.Разве вы не хотели показывать строку в текстовой таблице с LanguageId = 2?Без использования рекурсивного запроса или цикла вы не сможете продолжать следовать DefaultId языка, пока не окажетесь на английском.Предполагая, что в текстовой таблице есть строка для резервной копии украинского языка (2 = русский):
DECLARE
@CommentId BIGINT = 1,
@LanguageCode NVARCHAR(2) = 'ua';
SELECT
CommentId = COALESCE(t.CommentId, a.CommentId),
TextId = COALESCE(t.TextId, a.TextId),
[Text] = COALESCE(t.[Text], a.[Text]),
LanguageId = COALESCE(t.LanguageId, a.LanguageId),
RequestedLanguageId = @LanguageCode
FROM
dbo.common_LanguageType AS l
LEFT OUTER JOIN
dbo.common_Text AS t
ON l.LanguageId = t.LanguageId
AND t.CommentID = @CommentId
LEFT OUTER JOIN
dbo.common_Text AS a -- a for "alternate"
ON l.DefaultId = a.LanguageId
WHERE
l.Code = @LanguageCode
AND a.CommentID = @CommentId;
Если это не так, вам нужно прояснить вопрос.Если у вас есть LanguageId 4, «центральный украинский» с DefualtId = 3, при запросе этого языка запрос должен проверить текстовую таблицу на 4, когда он не найден, он проверяет значение по умолчанию для 4 (3), когда он не найден, он проверяет 3 по умолчанию (2), когда он не найден, он проверяет 2 по умолчанию (1) и, наконец, возвращает строку для 1?В этом случае вам, безусловно, понадобится более сложный запрос (с использованием либо рекурсивного CTE, либо цикла).
Также для кода языка вам, вероятно, следует использовать NCHAR(2)
вместо NVARCHAR(2)
.Надеюсь, колонка не обнуляемая и не уникальная.