2017-06-16 50 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個結果行。

相關問題