Самый умный способ объединить две таблицы SQL на значение поиска - PullRequest
4 голосов
/ 25 июля 2011

У меня есть две таблицы в Sql Server 2008

Items
------
ItemNo
StartDate


Translation
-------
ItemNo
StartDate
Language
Description

В таблице переводов есть несколько переводов для каждого продукта, т.е.

ItemNo: 123
StartDate: 2011-11-02
Language: SE
Description: 'Bla1'
ItemNo: 123
StartDate: 2011-11-02
Language: DK
Description: 'Bla2'

Как создать оператор быстрого выбора, который выводит по одной строке для каждого продукта без использования слишком большого количества поисков, например

    Itemno  StartDate  DK     SE
------------------------------------
    123     2011-11-02 Bla1   Bla2

Заранее спасибо Jens

1 Ответ

2 голосов
/ 25 июля 2011

Вот версия, использующая XML для того, что вы хотите. Я не проверял производительность по сравнению с другими методами, предложенными в комментариях.

Не могу понять, почему StartDate должно быть в обеих таблицах, кроме того, что оно является частью PK в таблице Items. Если StartDate не является частью PK, вы можете безопасно удалить его из всех объединений.

declare @Items table
(
  ItemNo int,
  StartDate date
)

declare @Translation table
(
  ItemNo int,
  StartDate date,
  Language varchar(2),
  Description varchar(20)
)

insert into @Items values
(123, '2011-11-02')

insert into @Translation values
(123, '2011-11-02', 'DK', 'Bla1'),
(123, '2011-11-02', 'SE', 'Bla2')


select I.ItemNo,
       I.StartDate,
       T.Trans.value('(Trans[@Language="DK"]/Desc)[1]', 'varchar(20)') as DK,
       T.Trans.value('(Trans[@Language="SE"]/Desc)[1]', 'varchar(20)') as SE
from @Items as I
  inner join (select T1.ItemNo,
                     T1.StartDate,
                     (select T2.Language as '@Language',
                             T2.Description as 'Desc'
                      from @Translation as T2
                      where T1.ItemNo = T2.ItemNo and
                            T1.StartDate = T2.StartDate
                      for xml path('Trans'), type) as Trans
              from @Translation as T1
              group by T1.ItemNo,
                       T1.StartDate) as T
    on I.ItemNo = T.ItemNo and
       I.StartDate = T.StartDate                       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...