如何在MS SQL中创建虚拟表

时间:2018-05-04 10:03:13

标签: sql sql-server tsql

我发现用音乐家解释比用我的实际数据更容易。 每个音乐家都有一个ID,用于他们的名字和乐器。

Select ID, NAME, PARAM FROM TABLE

当前结果

ID  NAME        PARAM
911 John        Name  
911 Guitar      Instr 1  
911 Piano       Instr 2
912 Paul        Name 
912 Bass        Instr 1
912 Piano       Instr 2
912 Guitar      Instr 3
913 Freddie     Name
913 Piano      Instr 1
913 Guitar     Instr 2
914 Brian      Name
914 Guitar     Instr 1

我想添加一个专栏' Band'我需要从ID&#39开始创建

  • BAND = B包括(' 911',' 912')
  • BAND = Q包括(' 913',' 914')

通缉结果

ID    NAME      PARAM    BAND
911 John        Name     B
911 Guitar      Instr 1  B
911 Piano       Instr 2  B 
912 Paul        Name     B
912 Bass        Instr 1  B
912 Piano       Instr 2  B
912 Guitar      Instr 3  B
913 Freddie     Name     Q
913 Piano      Instr 1  Q
913 Guitar     Instr 2  Q
914 Brian      Name     Q
914 Guitar     Instr 1  Q

3 个答案:

答案 0 :(得分:3)

查询将为您提供所需的结果:

select id,
       name,
       param,
       case when id in (911,912) then 'B' when id in (913,914) then 'Q' end [Band]
from MY_TABLE

现在,如果您愿意,可以CREATE VIEW

create view v_tableWithBand as
select id,
       name,
       param,
       case when id in (911,912) then 'B' when id in (913,914) then 'Q' end [Band]
from MY_TABLE

将结果存储在临时表中:

select id,
       name,
       param,
       case when id in (911,912) then 'B' when id in (913,914) then 'Q' end [Band]
into #tempTableWithBand 
from MY_TABLE

或表变量:

declare @tableWithBand table (id int, name varchar(100), param varchar(100), band char(1))
insert into @tableWithBand 
select id,
       name,
       param,
       case when id in (911,912) then 'B' when id in (913,914) then 'Q' end [Band]
from MY_TABLE

并查询此数据。

答案 1 :(得分:2)

使用case表达式:

select *,
        (case when ID in (911, 912) 
              then 'B' 
              when ID in (913, 914)
              then 'Q' 
         end) as BAND
from table t;

答案 2 :(得分:2)

您的数据不是3NF

我知道打破桌子看起来很痛苦但是有效。例如,如果乐队名称发生变化,您可以在一个位置进行更改。音乐家可以在多个乐队中。

Musician 
ID int PK 
Name varchar(200)

Instrument
ID int PK 
Name varchar(200) 

MusicianInstrument
musician in FK  
insturment int FK 
composite PK

Band 
ID int PK 
Name varchar(200) 

MusicianBand
musician int FK  
band int FK

select m.Name, i.Name, b.Name
 from Musician m 
 left join MusicianInsturment mi 
   on mi.Musician = m.ID 
 left join Insturment i 
   on i.ID = mi.Insturment 
 left join MusicianBand mb 
   on mb.Musician = m.ID 
 left join Band b
   on b.ID = mb.Band