1

我有两个表 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 中的每个 _X 和 _Y 列返回抗原描述。

4

2 回答 2

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 
于 2012-12-10T14:20:45.053 回答
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 次是否是最有效的,因此UNPIVOT在具有 24 列的表上执行并加入该结果可能会更容易:

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

UNPIVOT与使用UNION ALLontablex将数据从多列转换为数据行相同,这将更容易加入:

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因为以这种方式构建的表会使访问数据变得困难。

于 2012-12-10T14:29:53.980 回答