Как создать виртуальную таблицу в MS SQL - PullRequest
0 голосов
/ 04 мая 2018

Мне было проще объяснить с музыкантами, чем с моими фактическими данными. У каждого музыканта есть идентификатор, который используется для его имени и инструментов.

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', который мне нужно создать, начиная с идентификатора

  • 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 голосов
/ 04 мая 2018

Запрос даст вам желаемый результат:

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

и запросить эти данные.

0 голосов
/ 04 мая 2018

Ваши данные не 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
0 голосов
/ 04 мая 2018

Использовать case выражение:

select *,
        (case when ID in (911, 912) 
              then 'B' 
              when ID in (913, 914)
              then 'Q' 
         end) as BAND
from table t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...