这里有几种方法可以完成。
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个结果行。
你有什么试过?你卡在哪里? –