T-SQL View для выбора FULL OUTER JOIN и добавления дополнительных строк в «A» на основе таблицы «B» - PullRequest
0 голосов
/ 24 января 2010

Я надеюсь, что кто-то может мне помочь.

Мне нужно решить проблему с помощью представления, которое даст мне правильный результат, основанный на следующем сценарии.

У меня есть две таблицы: Language и ReportDescription

Язык

Id   Tag  Description  
---- ---- ----------------
1    en   English     
2    de   German  
3    fr   French  
4    it   Italian  

Описание отчета

LanguageId ReportId    Description  
---------- ----------- -------------------
1          1           Committee of (Eng)  
2          1           Committee of (German)  
3          1           Committee of (French)  
4          1           Committee of (Ita)  
1          2           Appointment of (Eng)  

Результат, который я хотел бы получитьесли бы это было:

LanguageId ReportId    Description  
---------- ----------- -------------------
1          1           Committee of (Eng)  
2          1           Committee of (German)  
3          1           Committee of (French)  
4          1           Committee of (Ita)  
1          2           Appointment of (Eng)  
2          2           Appointment of (Eng)  
3          2           Appointment of (Eng)  
4          2           Appointment of (Eng)  

Любая помощь будет очень ценится.

Ответы [ 2 ]

0 голосов
/ 24 января 2010

Если то, что вы ищете, является отчетом по умолчанию, когда он недоступен на определенном языке, этот запрос сделает это:

SELECT rd.LanguageId, rd.ReportId, 
 COALESCE(r.Description, 
   (SELECT Description FROM ReportDescription
    WHERE ReportDescription.ReportId = rd.ReportId AND LanguageId = 1)) AS Description
FROM (SELECT DISTINCT ReportId, l.Id AS LanguageId FROM ReportDescription, Language l) rd
LEFT JOIN ReportDescription r ON rd.LanguageId = r.LanguageId AND rd.ReportId = r.ReportId
ORDER BY rd.ReportId, rd.LanguageId

По умолчанию в вашем вопросе английский язык (не забудьте добавить поддержку испанского языка ;-)).

0 голосов
/ 24 января 2010

Этот возвращает результат, который вы описываете, надеюсь, это то, что вы хотите.

Это займет FallbackDescription, если эта запись не существует в ReportDescription.

SELECT
  l.id LanguageId, r.ReportId,
  COALESCE( rd.Description, r.FallbackDescription ) Description
FROM language l
JOIN ( SELECT ReportId, MIN(Description) FallbackDescription
       FROM ReportDescription
       GROUP BY ReportId ) r ON ( 1 = 1 )
LEFT JOIN ReportDescription rd ON ( rd.Id = l.Id AND rd.ReportId = r.ReportId )
ORDER BY ReportId, LanguageId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...