Как разбить таблицу на группу таблиц на основе критериев? - PullRequest
0 голосов
/ 24 апреля 2019

В таблице с именем «A» содержатся следующие данные

Таблица A:

type   name  age
-----------------
dog     a     2
bird    b     1
dog     c     3
cat     d     2
bird    e     2

Я стремлюсь разбить эту таблицу на группу таблиц на основе определенных критериев, таких как «Тип», следующим образом:

Таблица 1:

type   name  age
-----------------
dog    a     2
dog    c     3

Таблица 2:

type   name  age
-----------------
bird    b     1
bird    e     2

Таблица 3:

type   name  age
-----------------
cat     d     2

Ответы [ 5 ]

1 голос
/ 24 апреля 2019

может попытаться использовать создание представления

   create view table1 as 
   select type, name, age 
   from table_a 
   where type ='dog'
   ;

  create view table2 as 
   select type, name, age 
   from table_a 
   where type ='bird'
   ;

   create view table3 as 
   select type, name, age 
   from table_a 
   where type ='cat '
   ;
0 голосов
/ 26 апреля 2019

Чтобы избежать дублирования кода и создания ненужных таблиц, я бы создал табличное UDF (определяемая пользователем функция), которое принимает критерии в качестве входного параметра (type в вашем случае) и возвращает исходную таблицу Отфильтровано соответственно:

create function GetNameByType
(   
    @type varchar(50)
)
returns table 
as
return 
(
    select [type], [name], [age]
    from A
    where [type] = @type
)
GO

Теперь вы можете вызывать функцию GetNameByType с различными значениями type и использовать ее как таблицу.

Запрос 1:

select * from GetNameByType('dog')

результаты по запросу 1:

enter image description here

запрос 2:

select * from GetNameByType('bird')

результаты для запроса 2:

enter image description here

запрос 3:

select * from GetNameByType('cat')

результаты запроса 3:

enter image description here

Более подробную информацию о табличных UDF можно найти здесь .

0 голосов
/ 24 апреля 2019

Не могли бы вы попробовать это с cursor и SELECT INTO:

DECLARE @Type VARCHAR(50);
DECLARE @TableCounter INT;
DECLARE @SQL VARCHAR(MAX);
DECLARE @TableName VARCHAR(20);

SET @TableCounter = 1;


DECLARE db_cursor CURSOR FOR 
SELECT DISTINCT type 
FROM Table_A

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @Type

WHILE @@FETCH_STATUS = 0  
BEGIN  
      PRINT @Type
      SET @TableName = CONCAT('Table_', @TableCounter)
      SET @SQL = 'SELECT * INTO '+ @TableName +' FROM Table_A WHERE Type = ''' + @Type+''''

      EXEC (@SQL)

      SET @TableCounter = @TableCounter + 1;

      FETCH NEXT FROM db_cursor INTO @Type 
END 

CLOSE db_cursor  
DEALLOCATE db_cursor 

Я думаю, что этот код может быть коротким с вложенным предложением, но работает.

0 голосов
/ 24 апреля 2019

Я думаю, что вам нужно написать процедуру с циклом while, где итератор будет подсчитывать количество типов.Затем создайте таблицу для каждого типа отдельно с одинаковыми столбцами и вставьте данные в таблицу в цикле while.

0 голосов
/ 24 апреля 2019

Хорошо, если предположить, что другие таблицы уже созданы, вам просто понадобится INSERT INTO ... SELECT, например, для table1:

INSERT INTO table1 (type, name, age)
SELECT type, name, age
FROM tableA
WHERE type = 'dog';

Однако выполнение того, что вы предлагаете, являетсяшаг в неправильном направлении, скорее всего, потому что ваша текущая таблица будет проще в использовании.Если вместо этого вы используете много таблиц, в которых хранятся данные, которые по логике очень похожи, то будет гораздо сложнее что-либо сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...