将来自同一表的数据合并到相同的记录中

时间:2017-01-31 11:58:36

标签: sql sql-server database

标题可能不是最准确的标题,但我有以下图表:

enter image description here

请注意, CultureTranslations 表包含来自其他3个PKFK列( ResourceKey )的合并NVARCHAR(256)

CultureTranslations 表包含类似于以下内容的数据:

ApplicationId | CultureCodeId | ResourceGroupId | ResourceKey | ResourceValue |
-------------------------------------------------------------------------------
1             | 1             | 1               | X           | X (US)
1             | 1             | 1               | Y           | Y (US)
1             | 1             | 1               | Z           | Z (US)
....
1             | 2             | 1               | X           | X (GB)
1             | 2             | 1               | Z           | Z (GB)
and so on...

其中 CultureCodeId 1 = en-US,2 = en-GB

问题是,文化en-GB可能没有所有等效en-US记录的记录,仅适用于某些记录。

如何根据上述内容编写查询或视图,以便将同一行/记录中不同文化的资源组合在一起? E.g:

s.ApplicationId | s.ResourceGroupId | s.ResourceKey | s.ResourceValue | d.ResouceValue |
----------------------------------------------------------------------------------------
1               | 1                 | X             | X (US)          | X (GB)
1               | 1                 | Y             | Y (US)          | null
1               | 1                 | Z             | Z (US)          | Z (GB)

其中s =源文化(en-US),d =目标文化(en-GB)。

它应始终显示来自源的所有 ResourceKey ,但将null放在d.ResourceValue列中,其中未找到该特定 ResourceKey的资源 ApplicationId &的 ResourceGroupId

2 个答案:

答案 0 :(得分:1)

使用left join并将where条款的一部分放在join specification中,可以获得您想要的结果。

测试设置:http://rextester.com/UXUZXH20794

create table CultureTranslation (
    ApplicationId   int not null
  , CultureCodeId   int not null
  , ResourceGroupId int not null
  , ResourceKey     nvarchar(256)
  , ResourceValue   nvarchar(256)
);

insert into CultureTranslation values
 (1,1,1,'X','X,(US)')
,(1,1,1,'Y','Y,(US)')
,(1,1,1,'Z','Z,(US)')
,(1,2,1,'X','X,(GB)')
,(1,2,1,'Z','Z,(GB)');

查询:

select 
     s.ApplicationId
  ,  s.ResourceGroupId
  ,  s.ResourceKey
  ,  s.ResourceValue
  ,  d.ResourceValue
  from
    CultureTranslation s
      left join CultureTranslation d 
         on s.ApplicationId = d.ApplicationId
        and s.ResourceGroupId = d.ResourceGroupId
        and s.ResourceKey = d.ResourceKey
        and d.CultureCodeId = 2
  where s.CultureCodeId = 1

结果:

+---------------+-----------------+-------------+---------------+---------------+
| ApplicationId | ResourceGroupId | ResourceKey | ResourceValue | ResourceValue |
+---------------+-----------------+-------------+---------------+---------------+
|             1 |               1 | X           | X,(US)        | X,(GB)        |
|             1 |               1 | Y           | Y,(US)        | NULL          |
|             1 |               1 | Z           | Z,(US)        | Z,(GB)        |
+---------------+-----------------+-------------+---------------+---------------+

答案 1 :(得分:0)

从CultureCode A中选择A. ,B。  内部加入CultureCode B A.ResourceKey = B.ResourceKey 其中A.CultureCodeId = B.CultureCodeId