как вставить разные данные таблицы в одну таблицу

таблица 1

Groupname   View
member      table a
non member  table b
teacher     table c

таблица a

id  key
1   A
2   B
3   C

ТАБЛИЦА B

ID  KEY
1   M
2   L
3   H
4   G
5   F

ТАБЛИЦА C

ID  KEY
1   Y
2   W

выход

GROUPNAME   KEY
member      A
member      B
member      C
non member  M
non member  L
non member  H
non member  G
non member  F
teacher     Y
teacher     W
-3
задан 13 August 2018 в 14:37

2 ответа

Как уже отмечал Гордон Линофф: Я думаю, что ваш дизайн базы данных может использовать некоторую работу. Если бы вам пришлось писать динамический SQL, чтобы создать тот же тип структуры запросов, что и Гордон, созданный в его ответе, это могло бы сделать трюк (если бы каждый вид имел «ключевую» переменную, а таблицы были сделаны с использованием схемы по умолчанию ).

declare @t1 table ([groupname] varchar(20), [view] varchar(20))
insert into @t1 values ('member','table a'),('non member','table 3'),('teacher','table 4')
declare @q varchar(max)='', @groupname varchar(20),@viewname varchar(20)
declare c cursor for select [groupname],[view] from @t1 
    open c 
        fetch next from c into @groupname, @viewname
        while @@FETCH_STATUS=0 
        begin
            set @q=@q+'select '''+@groupname+''' as Groupname, '+QUOTENAME(@viewname)+'.[key] from '+QUOTENAME(@viewname)+'{$crlf}union all{$crlf}'
            fetch next from c into @groupname, @viewname
        end
    close c
deallocate c
set @q=replace(left(@q,len(@q)-23),'{$crlf}',CHAR(10))
print @q
exec (@q)
0
ответ дан 15 August 2018 в 17:04

Если вы хотите сделать это с помощью одного запроса, вы можете также жестко указать имена и использовать union all:

select 'member' as groupname, key
from a
union all
select 'non member' as groupname, key
from a
union all
select 'teacher' as groupname, key
from a;

Я имею в виду, вы могли бы заменить подзапросы:

select t1.groupname, key
from a join
     table1 t1
     on t1.view = 'a';

Однако жесткое кодирование имени представления по сравнению с groupname кажется произвольным.

Если вы хотите сделать это более динамично, вам нужно будет использовать динамический SQL. Вместо этого я бы посоветовал вам изменить структуру данных, объединив три таблицы и добавив столбец groupname. Хранение имен таблиц и столбцов в таблицах обычно не является хорошим подходом к дизайну базы данных.

1
ответ дан 15 August 2018 в 17:04
  • 1
    Для динамического написания. – chaitu chaitanya reddy 13 August 2018 в 14:07
  • 2
    Динамически, как писать, если любое имя группы можно добавить в функцию, нужно добавить вручную. – chaitu chaitanya reddy 13 August 2018 в 14:12
  • 3
    @chaituchaitanyareddy Вы не новы, и SO не является бесплатным кодовым письмом. Вы поощряете других к помощи, включая mvce . В небольшом поиске найдутся примеры динамического sql - это тот метод, который вам нужно будет использовать для достижения вашей цели. В качестве альтернативы вы можете обратиться за помощью к другим разработчикам sql в своей организации - наверняка у кого-то в вашей фирме этот уровень мастерства. – SMor 13 August 2018 в 16:44

Другие вопросы по тегам:

Похожие вопросы: