SQL - 根据列的内容拆分表
Posted
技术标签:
【中文标题】SQL - 根据列的内容拆分表【英文标题】:SQL - Split table based upon a column's content 【发布时间】:2017-12-08 11:07:40 【问题描述】:我有一个包含 20 列的大型数据库(约 50,000 行),我想根据第三列(称为 FEATURE_CLASS)中的值“拆分”数据。 FEATURE_CLASS 的值都是 VARCHAR() 类型,我想创建许多表,但我需要用许多较小的表替换单个大表,每个表的权限都是原始表的 FEATURE_CLASS 值。
不确定解决此问题的最佳方法,我正在考虑创建一个用作索引的临时表,每一行都带有一个唯一的 FEATURE_CLASS 值,然后遍历临时表并对临时表的每一行执行复制操作。我不确定从这里去哪里,任何帮助/想法将不胜感激。谢谢!
【问题讨论】:
50,000 行并没有那么大。无论如何,我不清楚列数据......“feature_class”中的值是逗号分隔列表,还是其他情况?你能在该列中发布一个数据的小例子吗? 阅读本文! ***.com/a/16812941/3617531 我同意@PaulT。在那 50K 行根本就不大。如果您在该表大小方面遇到性能问题,您可能只需要优化。我可以想象你可能还有其他理由这样做。 很抱歉打扰您,但 50K 行并不是“大”。而且您真的不应该将表格“拆分”成多个迷你表格。如果您这样做,您的查询和维护问题将成倍增加。 【参考方案1】:基本思想是创建一个语句的结果集,这些语句将为您创建表并填充正确的数据。运行以下命令以生成语句。然后,您可以手动(复制/粘贴)或在脚本中执行这些语句。
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 的更多信息。
【讨论】:
我想我不确定如何“生成报表”。我尝试运行您的查询(适当更改了 TableName)并且查询不返回任何内容(顺便说一下,这是在 SQL 选项卡 phpMyAdmin 中)。就脚本而言,我是否能够在 phpMyAdmin 中运行 SQL 命令,该命令根据 FEATURE_CLASS 列中的 SELECT DISTINCT 创建表,然后可能在以下语句中填充表? 你能提供你正在尝试的确切查询吗?SELECT DISTINCT 'SELECT * INTO [' + DB1.FEATURE_CLASS + '] FROM DB1 WHERE FEATURE_CLASS = ''' + DB1.FEATURE_CLASS + ''';' FROM DB1
我也尝试了各种其他修改过的查询,包括在表名上加上反引号(例如 DB1
而不是 DB1)。
我认为问题在于您使用的是 MySQL,而不是 SQL Server。我看到你为两者都标记了它,我用 SQL Server 运行。我更新了我的答案以包含一个 MySQL 示例。以上是关于SQL - 根据列的内容拆分表的主要内容,如果未能解决你的问题,请参考以下文章
根据表中另一个现有列的内容更改 SQL Server 中的现有列