我有一个包含描述列的表,同一个表中有各种其他列包含反映这些描述的整数值。在应用程序中,我需要使用这些值来记录描述。
sb
查询需要返回:
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第4行放在那里就像一个管理员。有任何想法吗???
答案 0 :(得分:0)
以下是一些可行的方法。
这是最容易理解的。您拥有来自不同表的数据的每个列都由子查询填充。该子查询对结果集中的每一行执行一次,拉回其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
子句来改变这种情况,如果该情况存在的话。是一个问题;即保证订单,这些结果将在&因此,这将是第一次。
通常这是更好的方法,但需要更多地了解要使用的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个结果行。