给出一个名为“ 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
答案 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)
您能尝试一下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
我认为这段代码在嵌套语句中可能很短,但是可以。
答案 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的结果
查询2:
select * from GetNameByType('bird')
查询2的结果
查询3:
select * from GetNameByType('cat')
查询3的结果
有关表值UDF的更多信息,请参见here。