2017-06-16 144 views
0

我有一个包含说明列的表,并且在同一个表中包含各种其他列,其中包含反映这些说明的整数值。在应用程序中,我需要使用这些值来记录说明。如何使用同一个表中的值从同一个表中提取值?

SC_CODE SC_DESC   UT_CODE SC_ALT_CODE SC_CANX_CODE 
1  BKG RESERVATION 1  4   901  
4  BKG CASH TRADE  1  NULL   904  
901  BKG RES CANCEL  1  NULL   NULL 

查询需要返回:

SC_CODE SC_DESC   UT_CODE SC_DESC(SC_ALT_CODE) SC_DESC(SC_CANX_CODE) 
1  BKG RESERVATION 1  BKG CASH TRADE  BKG RES CANCEL 

我把SC_CODE的第4排在那里只是作为一个地方的门将。有任何想法吗???

+1

你有什么试过?你卡在哪里? –

回答

0

这里有几种方法可以完成。

1.简单代码

这是最容易理解的。每个有不同表格数据的列都由子查询填充。该子查询对结果集中的每一行执行一次,从而将其SC_CODE与主表中相关列(SC_ALT_CODE或SC_CANX_CODE)匹配的“第一个”描述值拉回。

Select a.SC_CODE 
, a.SC_DESC 
, a.UT_CODE 
, (
    select top 1 SC_DESC 
    from TheTable b 
    where b.SC_CODE = a.SC_ALT_CODE 
) [SC_DESC(SC_ALT_CODE)] 
, (
    select top 1 SC_DESC 
    from TheTable b 
    where b.SC_CODE = a.SC_CANX_CODE 
) [SC_DESC(SC_CANX_CODE)] 
from TheTable a 
where SC_CODE = 1 

重要说明;如果有多个具有相同SC_CODE的行(例如,具有值901的2行),则以上可返回列[SC_DESC(SC_CANX_CODE)]的任一值。我们可以通过将order by子句添加到相关子查询中来改变这种情况(如果该场景存在的话)&是一个问题;即由此保证这些结果将在&中返回,因此这将是第一。

2.使用连接

一般来说,这是更好的方法,但它需要SQL中使用的多一点理解。上述

Select a.SC_CODE 
, a.SC_DESC 
, a.UT_CODE 
, b.SC_DESC [SC_DESC(SC_ALT_CODE)] 
, c.SC_DESC [SC_DESC(SC_CANX_CODE)] 
from TheTable a 
left outer join TheTable b 
    on b.SC_CODE = a.SC_ALT_CODE 
left outer join TheTable c 
    on c.SC_CODE = a.SC_CANX_CODE 
where a.SC_CODE = 1 

两个SQL实例都是有效的,并且都将给予你你问什么。根据情况,一个人可能比另一个更好;通常#2会表现更好,但在所有情况下都不是这样。

但是,重要的是,这两个的输出不能保证总是相同的。即如果你的表中有两行,两个都有SC_CODE,其值为901,你只会得到#1的1行,而#2有2行。这是因为#1只会从主表(a)的每个链表中返回1个结果;而在#2中,我们从3(a,b,& c)表格的每个匹配组合得到1个结果行。

相关问题