mysql - 从多个具有相同列名的表创建一个新表,而不声明列名

标签 mysql

我有 3 个表,我想从中提取数据并使用结果集创建一个新表。请注意,每个表都具有相同的列名称。

CREATE TABLE smsout_32020Nov2014
     AS 
(SELECT    *
FROM smsout17nov2014b,smsoutnov32014,smsout

WHERE smsoutnov32014.shortcode = 32020

AND  smsout.shortcode = 32020

AND smsout17nov2014b.shortcode = 32020);

问题是我收到一个错误,指出存在重复的列名称

有解决办法吗?

最佳答案

正如对您的问题的评论中所述,目前尚不清楚您实际上想要获得什么结果。然而,假设该问题反射(reflect)了对连接操作的完全误解,则 UNION ALL 可能正是您真正要寻找的。特别是,如果您想要三个命名表的所有行的 shortcode 列的值为 32020,那么将是这样的:

CREATE TABLE smsout_32020Nov2014 AS (
  SELECT smsout17nov2014b.*
  WHERE shortcode = 32030

  UNION ALL

  SELECT smsoutnov32014.*
  WHERE shortcode = 32030

  UNION ALL

  SELECT smsout.*
  WHERE shortcode = 32030
)

另一方面,如果您选择的结果实际上是您想要的形式,正如您修改了您的问题所说,那么您别无选择,只能分配显式的列名称以确保列名称的唯一性(因此至少对于三个基表中的两个基表中的每一列)。您可以通过 SELECT 语句中的别名或通过外部 CREATE TABLE 语句中的列列表(或两者)来完成此操作。您最初的问题似乎是说您想要的解决方法是避免这样做的一种方法,但现在它似乎只是说您想要修复错误。

SELECT 语句中进行修补会更简单一些。根据您修改后的起始查询,这将是这样的:

CREATE TABLE smsout_32020Nov2014 AS (
  SELECT
    smsout.*,
    m.col1 AS month_col1, m.col2 AS month_col2, ... m.shortcode AS month_shortcode,
    c.col1 AS code_col1,  c.col2 AS code_col2, ...  c.shortcode AS code_shortcode,
  FROM
    smsout17nov2014b m,
    smsoutnov32014 c,
    smsout
  WHERE smsoutnov32014.shortcode = 32020
    AND smsout.shortcode = 32020
    AND smsout17nov2014b.shortcode = 32020
);

新表格的列将为 col1col2、...shortcodemonth_col1month_col2,... month_shortcodecode_col1code_col2,... code_shortcode .

顺便说一句,请注意,即使这些结果是您想要的形式(这让我感到惊讶),我也很难相信这些行就是您想要的。

关于mysql - 从多个具有相同列名的表创建一个新表,而不声明列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27406976/

相关文章:

mysql - 选择最后一条消息超过 30 天的用户

mysql - SQL中有一个命令可以在列表中选择2个或更多匹配项吗?

mysql - rails : Delete user and user associated data in all associated models

sql - DB设计问题: Tree (one table) vs. 两个表用于推文和转发?

PHP:在打印输出前更改 SQL 表的输出

c# - jQuery 函数来激活 onclick 方法?

mysql - 为什么这个 "extractvalue"返回 null

mysql - 有多个 MAX 值

Mysql 查找两个日期列之间开始和结束日期范围的出现次数

mysql - 将一个查询集左连接到另一个查询集