在一个查找值上连接两个SQL表的最聪明的方法

在一个查找值上连接两个SQL表的最聪明的方法,sql,sql-server-2008,join,Sql,Sql Server 2008,Join,我在SQLServer2008中有两个表 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 Descr

我在SQLServer2008中有两个表

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'
如何构建一个快速select语句,为每个产品输出一行,而不使用太多的查找,如

    Itemno  StartDate  DK     SE
------------------------------------
    123     2011-11-02 Bla1   Bla2
先发制人
Jens

这是一个使用XML做您想做的事情的版本。我没有对照评论部分中建议的其他方法测试性能

不明白为什么StartDate应该在这两个表中,除了它是Items表中PK的一部分之外。如果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                       

您实际需要的是将行转换为列,在这里您可以找到更多的答案。希望它能有所帮助:搜索[SQL Server]+PIVOT:有多种方法可以使用这个用例,使用左连接,使用PIVOT.Thanx ypercube。你的链接非常有用。我可以将行转换为列并进行常规的内部连接。我做了一些测试,结果表明转换方法比常规查找慢得多。因此,我坚持将此作为解决方案选择Items.StartingDate,'DK'=从翻译T中选择T.Description,其中T.[ItemNo]=Items.ItemNo和S.StartingDate=T.StartingDate和T.Language='DK',…对于其他语言也是如此。