SQL - 基于列内容的拆分表

时间:2017-07-04 23:17:57

标签: mysql sql-server database phpmyadmin

我有一个包含20列的大型数据库(约50,000行),我希望"拆分"数据基于第三列中的值(称为FEATURE_CLASS)。 FEATURE_CLASS的值都是VARCHAR()类型,我想要创建许多表,我需要用多个较小的表替换单个大表,每个表都使用原始表的FEATURE_CLASS值是

不确定最好的解决方法,我正在考虑创建一个临时表作为索引的行,每行都带有FEATURE_CLASS的唯一值,然后迭代临时表和对临时表的每一行执行复制操作。我不确定从哪里开始,任何帮助/想法都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

基本思想是创建一个语句结果集,为您创建表并填充正确的数据。运行以下命令以生成语句。然后,您可以手动(复制/粘贴)或从脚本中执行这些语句。

SQL Server示例

SELECT DISTINCT
    'SELECT * INTO [' + TableName.FEATURE_CLASS + '] FROM TableName WHERE FEATURE_CLASS = ''' + TableName.FEATURE_CLASS + ''';'
FROM
    TableName

如果FEATURE_CLASS列中有任何特殊字符,您可能需要考虑在上面的脚本中删除它们,以防止表名无效或难以使用。

例如:

...
    'SELECT * INTO [' + REPLACE(TableName.FEATURE_CLASS, '.', '') + '] FROM TableName WHERE FEATURE_CLASS = ''' + TableName.FEATURE_CLASS + ''';'
...

MySQL示例

SELECT DISTINCT 
    CONCAT('CREATE TABLE `', DB1.FEATURE_CLASS, 
        '` AS SELECT * FROM DB1 WHERE FEATURE_CLASS = ''', 
        DB1.FEATURE_CLASS, ''';') AS statements
FROM DB1;

这将为您提供类似这样的MySQL命令:

CREATE TABLE `feature_class_value` AS 
    SELECT * FROM DB1 
        WHERE FEATURE_CLASS = 'feature_class_value';

查看MySQL文档以获取有关CREATE TABLE SELECT选项https://dev.mysql.com/doc/refman/5.7/en/create-table-select.html的更多信息。