【问题标题】:Please explain these SQL statements请解释这些 SQL 语句
【发布时间】:2018-07-05 10:16:42
【问题描述】:

请解释一下下面的例子

SELECT GROUP_CONCAT(COLUMN_NAME)
FROM information_schema.`COLUMNS` C 
WHERE table_name = 'table_name'
  AND COLUMN_NAME =('columns_name') INTO @COLUMNS;

SET @table = 'table_name';

SET @s = CONCAT('SELECT ',@columns,' FROM ', @table);

PREPARE stmt FROM @s;

【问题讨论】:

  • "在下面解释一下"你的问题很笼统,你能澄清一下你想要什么吗?
  • 您是否阅读了您不理解的每条语句的手册?请澄清究竟是什么让您感到困惑。
  • 问题中的上述语句意味着,只需选择给定表的所有列
  • 使用给定sql中的所有列生成动态sql

标签: mysql prepared-statement dynamic-sql information-schema


【解决方案1】:

这种模式是关于基于特定表中的列名创建动态(在 MySQL 用语中准备)查询。 INFORMATION_SCHEMA 是一个内置的数据库,具有只读表,描述 MySQL 服务器上所有数据库中的所有表。

序列中的第一个查询检索局部变量 @COLUMNS 中的文本字符串,其值类似于

      id,name,value,description

对于一个名为 table_name 的表,其中包含这四列。

第三个在局部变量@s 中检索一个字符串,其值包含类似查询

      SELECT id,name,value,description FROM table_name

第四个,PREPARE,准备执行EXECUTE stmt,它运行查询。 You can read about PREPARE and EXECUTE here.

您问题中的整个查询序列与SELECT * FROM table_name 几乎完全相同。

您的第一个查询存在缺陷。您应该将AND TABLE_SCHEMA = DATABASE() 添加到其WHERE 子句中。否则,您可能会从多个数据库中名为 table_name 的表中提取列。

【讨论】:

  • 我还有一个问题.. 我的源表有 5 列。我需要为源创建映射表。当我们试图在 mappng 表的帮助下将源数据插入另一个表时。我们需要编写一个动态查询来将数据插入另一个表。有时,源表中的列增加到 7。我们只需要在映射表中进行更改,而不是在 sql 查询中进行更改。查询应该动态地从源表中选择数据并将其加载到目标表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多