#sql-server #join #relationship #coalesce #not-exists
#sql-server #Присоединиться #связь #объединить #не существует
Вопрос:
пожалуйста, кто-нибудь может помочь мне получить правильный запрос?
У меня есть две таблицы, содержащие информацию о названии / приветствии. Первый, ‘Title’ содержит окончательный список системных / английских определений заголовка / приветствий, а другой ‘TitleTranslation’ содержит текст перевода, в котором он был добавлен. Данные перевода могут полностью или частично отсутствовать для любого языкового кода, поэтому системные данные по умолчанию должны быть предоставлены, когда они отсутствуют.
Title
-----
TitleId INT PK
Name VARCHAR(12) /* English (en) / system version */
TitleTranslation
----------------
TitleTranslationId INT PK
TitleId INT FK
LanguageCode CHAR(2) /* 2 character ISO code (fr, es, ...) */
Name VARCHAR(12)
То, что мне нужно сделать для заданного параметра, который указывает код языка, например ‘fr’, возвращает любой переведенный заголовок ‘Name’ там, где они существуют в системе, или заголовок английской системы по умолчанию ‘Name’ там, где их нет. Кроме того, мне нужно иметь возможность указать фильтр по имени.
Пока у меня есть этот запрос,
DECLARE @LanguageCode CHAR(2);
SELECT @LanguageCode = 'fr';
DECLARE @NameFilter VARCHAR(12);
SELECT @NameFilter = 'M';
SELECT COALESCE([TitleTranslation].[name], [Title].[Name]) [Name]
FROM [ref].[Title]
LEFT OUTER JOIN [ref].[TitleTranslation]
ON [ref].[TitleTranslation].[TitleId] = [ref].[Title].[TitleId]
WHERE ([ref].[TitleTranslation].[LanguageCode] = @LanguageCode
OR [ref].[TitleTranslation].[LanguageCode] IS NULL)
AND COALESCE([TitleTranslation].[name], [Title].[Name]) Like '%' @NameFilter '%';
Является ли функция объединения с ВНЕШНИМ соединением лучшим способом для достижения этой цели? Или есть лучший способ сделать это?
Комментарии:
1. Мне кажется, это нормально. в двух словах — остерегайтесь преждевременной оптимизации. в двух словах — если у вас нет веской причины или сам запрос не выполняет то, что вы хотите, не пытайтесь его оптимизировать. если вы хотите его оптимизировать, запустите его через ssms и отобразите его план запроса. сам sql выглядит хорошо.
2. Спасибо за совет. Я не силен в запросах, которые являются чем-то иным, кроме стандартных CRUD!