我想知道这个问题。
在下面的查询中,我试图选择@transcript作为2列值的组合。但是当我在select语句中使用这个变量时,我只得到3个结果(实际输出应该是8个结果)。当我在select语句中直接使用条件时获得实际输出。
任何人都可以帮我解决这个问题。
declare @transcript varchar(10)
select @transcript = [CAREER_CD]+[CAREER_SUFX_CD] from dbo.SR0DAT
select DISTINCT @transcript transcriptCareerCode,
case @transcript
when 'U1' then 'BACCALAUREATE'
when 'U2' then 'SECOND BACCALAUREATE'
when 'G1' then 'GRADUATE'
when 'L1' then 'LAW'
when 'D1' then 'DENTISTRY'
when 'M1' then 'MEDICINE'
when 'IU' then 'transcriptCareerName'
when 'IG' then 'IEO Graduate'
end as transcriptCareerName
from dbo.SR0DAT
WHERE @transcript <>'G2'
union
select 'IU','IEO Undergraduate'
union
select 'IG','IEO Graduate'
输出:
transcriptCareerCode transcriptCareerName
G1 GRADUATE
IG IEO Graduate
IU IEO Undergraduate
第二段代码:
select DISTINCT [CAREER_CD]+[CAREER_SUFX_CD] transcriptCareerCode,
case [CAREER_CD]+[CAREER_SUFX_CD]
when 'U1' then 'BACCALAUREATE'
when 'U2' then 'SECOND BACCALAUREATE'
when 'G1' then 'GRADUATE'
when 'L1' then 'LAW'
when 'D1' then 'DENTISTRY'
when 'M1' then 'MEDICINE'
when 'IU' then 'transcriptCareerName'
when 'IG' then 'IEO Graduate'
end as transcriptCareerName
from dbo.SR0DAT
WHERE [CAREER_CD]+[CAREER_SUFX_CD] !='G2'
union
select 'IU','IEO Undergraduate'
union
select 'IG','IEO Graduate'
输出:
transcriptCareerCode transcriptCareerName
D1 DENTISTRY
G1 GRADUATE
IG IEO Graduate
IU IEO Undergraduate
L1 LAW
M1 MEDICINE
U1 BACCALAUREATE
U2 SECOND BACCALAUREATE
答案 0 :(得分:1)
在第一个查询中,您将通过变量@transcript创建一个奇异值。结果,您致电:
select @transcript = [CAREER_CD]+[CAREER_SUFX_CD] from dbo.SR0DAT
仅保证SELECT语句中的最后一条记录被分配给@transcript变量。
因此,该查询中只会返回一行(您在第一个示例中已经联合了另外两行)。
第二个例子是使用实际的数据库集逻辑来引入集合中的值 - 而不仅仅是集合中的最后一个值。
答案 1 :(得分:1)
虽然两个查询确实是针对您的表运行的,但在第一个查询中根本没有使用任何列:对于每一行,您只需返回一个固定/常量表达式。 distinct
选项有助于掩盖所发生的事情,如果删除了该选项,您将会看到所有正在折叠成一行的多个副本。如果你也说select @transcript, * ...
,你也会看到其他数据的位置。
您是否只是想为transcript
表达式创建一个别名,这样您就不必重复它了?
with T as (
select CAREER_CD + CAREER_SUFX_CD as transcript
from dbo.SR0DAT
)
select DISTINCT
transcript transcriptCareerCode,
case transcript
when 'U1' then 'BACCALAUREATE'
when 'U2' then 'SECOND BACCALAUREATE'
when 'G1' then 'GRADUATE'
when 'L1' then 'LAW'
when 'D1' then 'DENTISTRY'
when 'M1' then 'MEDICINE'
when 'IU' then 'transcriptCareerName'
when 'IG' then 'IEO Graduate'
end as transcriptCareerName
from T
where transcript <> 'G2'
union
select 'IU', 'IEO Undergraduate'
union
select 'IG', 'IEO Graduate'