我有两张桌子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列。
答案 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
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
,因为以这种方式构建表格会使访问数据变得困难。