我有 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
);
新表格的列将为 col1
、col2
、...shortcode
、month_col1
、 month_col2
,... month_shortcode
,code_col1
,code_col2
,... code_shortcode
.
顺便说一句,请注意,即使这些结果是您想要的形式(这让我感到惊讶),我也很难相信这些行就是您想要的。
关于mysql - 从多个具有相同列名的表创建一个新表,而不声明列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27406976/