2017-07-04 107 views
0

我有一个包含20列的大型数据库(〜50,000行),我想根据第三列(称为FEATURE_CLASS)中的值“拆分”数据。 FEATURE_CLASS的值都是VARCHAR()类型的,我想创建无论多少个表,我都需要使用许多小表来替换单个大表,每个小表都可以使用任何原始表的FEATURE_CLASS值。SQL - 基于列内容的拆分表

不确定最好的方式去做这件事,我正在想办法创建一个临时表作为索引,每一行都带有一个唯一的FEATURE_CLASS值,然后迭代临时表并对临时表的每一行执行复制操作。我不确定从哪里出发,任何帮助/想法都将不胜感激。谢谢!

+1

50,000行不是那么大。无论如何,我不清楚列数据是不是......“feature_class”中的值是逗号分隔列表还是其他一些情况?你能在这一栏中发布一个小例子的数据吗? –

+0

阅读! https://stackoverflow.com/a/16812941/3617531 –

+1

我会同意@PaulT。因为50K行根本不大。如果您的桌子尺寸存在性能问题,那么您可能只需要优化。我可以想象你也可以有其他的理由来做到这一点。 –

回答

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

+0

这有帮助,谢谢! –

+0

我想我不知道如何“生成语句”。我试着运行你的查询(并且适当地修改了TableName),并且查询什么也没有返回(顺便说一句,这是在SQL选项卡phpMyAdmin中)。 就脚本而言,我能否在phpMyAdmin中运行SQL命令,该命令基于FEATURE_CLASS列中的SELECT DISTINCT创建表,然后可能在下面的语句中填充表? –

+0

你能提供你正在尝试的确切查询吗? –