获取多个id值的描述 - SQL Server

时间:2012-12-10 14:12:23

标签: sql sql-server tsql unpivot

我有两张桌子x和y

表x有24列,每列包含不同的Id值

表Y具有Id值列和描述

我需要编写一个过程,查询或视图,以尽可能最佳的方式返回表x中包含的每个24 Id值的描述。

我写了一个调用函数24次的视图。该函数根据提供的Id返回描述。 虽然这有效,但它的表现并不是特别好。

我是否应该使用一种技术,在单个表格中需要这么多描述?

以下是表x的定义(为清晰起见,删除了非相关列)

    [DefinitiveHLATypeId] [int] IDENTITY(1,1) NOT NULL,
[PersonId] [int] NOT NULL,
[A_X] [int] NULL,
[A_Y] [int] NULL,
[B_X] [int] NULL,
[B_Y] [int] NULL,
[Bw_X] [int] NULL,
[Bw_Y] [int] NULL,
[C_X] [int] NULL,
[DRB1_X] [int] NULL,
[DRB1_Y] [int] NULL,
[DRB3_X] [int] NULL,
[DRB3_Y] [int] NULL,
[DRB4_X] [int] NULL,
[DRB4_Y] [int] NULL,
[DRB5_X] [int] NULL,
[DRB5_Y] [int] NULL,
[DQA_X] [int] NULL,
[DQA_Y] [int] NULL,
[DQB_X] [int] NULL,
[DQB_Y] [int] NULL,
[DPA1_X] [int] NULL,
[DPA1_Y] [int] NULL,
[DPB1_X] [int] NULL,
[DPB1_Y] [int] NULL

以下是表y的定义(为清晰起见,删除了非相关列)

    [AntigenId] [int] IDENTITY(1,1) NOT NULL,
[AntigenDescription] [varchar](2000) NOT NULL

两个表之间的关系介于_X&之间。表x中的_Y列和表Y中的AntigenId列

我需要返回每个_X&的Antigen描述。表x中的_Y列。

2 个答案:

答案 0 :(得分:0)

加入

select tbl.col1ID, desc1.desc, tbl.col2ID, desc2.desc
from tbl 
join desc as desc1 
  on desc1.ID = col1ID 
join desc as desc2 
  on desc2.ID = col1ID 

答案 1 :(得分:0)

如果没有在表中看到任何示例数据,如果您有一个表,其中有24列数据需要与另一个表进行比较,则有几种方法可以执行此操作。

首先,您可以在表格上为每个列执行多个连接,类似于:

select *
from tablex x
left join tabley y1
  on x.col1 = y1.id
left join tabley y2
  on x.col2 = y2.id --- add more joins

我不知道24次加入表格是否最有效,因此在表格中使用24列执行UNPIVOT并加入该结果可能会更容易:

select x.value,
  y.description
from 
(
  select value, col
  from tablex
  unpivot
  (
    value
    for col in (col1, col2, col3, col4, col5)
  ) unpiv
) x
left join tabley y
  on x.value = y.id

请参阅SQL Fiddle with Demo

UNPIVOT与在UNION ALL上使用tablex将数据从多列转换为数据行相同,这样可以更轻松地加入:

select *
from
(
  select col1 value, 'col1' col
  from tablex
  union all
  select col2 value, 'col2' col
  from tablex
  union all
  select col3 value, 'col3' col
  from tablex
  union all
  select col4 value, 'col4' col
  from tablex
  union all
  select col5 value, 'col5' col
  from tablex
) x
left join tabley y
  on x.value = y.id

根据您的修改,您的查询将与此类似:

select x.value,
  y.AntigenDescription
from 
(
  select DefinitiveHLATypeId, PersonId, value, col
  from tablex
  unpivot
  (
    value
    for col in (A_X, A_Y, B_X, B_Y, Bw_X, Bw_Y,
                    C_X, DRB1_X, DRB1_Y, DRB3_X, DRB3_Y,
                    DRB4_X, DRB4_Y, DRB5_X, DRB5_Y, DQA_X, DQA_Y,
                    DQB_X, DQB_Y, DPA1_X, DPA1_Y,
                    DPB1_X, DPB1_Y
  ) unpiv
) x
left join tabley y
  on x.value = y.AntigenId

注意:从长远来看,我的建议是重新设计tablex,因为以这种方式构建表格会使访问数据变得困难。