如何根据条件将一个表拆分为一组表?

时间:2019-04-24 16:53:43

标签: sql sql-server tsql

给出一个名为“ 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 个答案:

答案 0 :(得分:1)

可以尝试使用创建视图

   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 '
   ;

答案 1 :(得分:0)

假设其他表已经创建,则只需要一个INSERT INTO ... SELECT,例如为table1

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

但是,做您建议的事情很可能是朝错误的方向迈出了一步,因为当前表将更易于使用。相反,如果您使用许多表来存储逻辑上非常相似的数据,那么做任何事情都将变得更加困难。

答案 2 :(得分:0)

我认为您需要编写一个带有while循环的过程,其中迭代器将是Types的计数。然后为每种类型分别创建一个具有相同列的表,并将所有数据插入表中的while循环中。

答案 3 :(得分:0)

您能尝试一下cursorSELECT 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 

我认为这段代码在嵌套语句中可能很短,但是可以。

答案 4 :(得分:0)

为避免代码重复和创建不必要的表,我将创建一个表值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的更多信息,请参见here