這裏有幾種方法可以完成。
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個結果行。
你有什麼試過?你卡在哪裏? –