【问题标题】:SQL - Split table based upon a column's contentSQL - 根据列的内容拆分表
【发布时间】:2017-12-08 11:07:40
【问题描述】:

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

不确定解决此问题的最佳方法,我正在考虑创建一个用作索引的临时表,每一行都带有一个唯一的 FEATURE_CLASS 值,然后遍历临时表并对临时表的每一行执行复制操作。我不确定从这里去哪里,任何帮助/想法将不胜感激。谢谢!

【问题讨论】:

  • 50,000 行并没有那么大。无论如何,我不清楚列数据......“feature_class”中的值是逗号分隔列表,还是其他情况?你能在该列中发布一个数据的小例子吗?
  • 我同意@PaulT。在那 50K 行根本就不大。如果您在该表大小方面遇到性能问题,您可能只需要优化。我可以想象你可能还有其他理由这样做。
  • 很抱歉打扰您,但 50K 行并不是“大”。而且您真的不应该将表格“拆分”成多个迷你表格。如果您这样做,您的查询和维护问题将成倍增加。

标签: mysql sql-server database phpmyadmin


【解决方案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 示例。
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2018-06-26
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多