Sql Server, выберите столбец из таблицы 2 и столбец из таблицы 1, где нет связи

#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!