"Every derived table must have its own alias" 在复杂的 MySQL 查询中
"Every derived table must have its own alias" in complex MySQL query
我有一个或多或少复杂的 MySQL select 查询,它基本上是来自两个复杂 tables:
的连接的 select
SELECT *
FROM
( SELECT ProblemID
, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz
FROM
( SELECT ProblemID
FROM Problemtag
WHERE Tagtext = "Francois"
UNION
ALL
SELECT ProblemID
FROM Problemtag
WHERE Tagtext = "Hollande"
) AS TagsSignifikanzTable
GROUP
BY ProblemID
)
JOIN
( SELECT ProblemID
, SUM(Einzelsignifikanz) AS Titelsignifikanz
FROM
( SELECT ProblemID
, 1 AS Einzelsignifikanz
FROM Problem
WHERE Titel LIKE "%Francois%"
UNION
ALL
SELECT ProblemID
, 1 AS Einzelsignifikanz
FROM Problem
WHERE Titel
LIKE "%Hollande%"
UNION
ALL
SELECT ProblemID
, 4 AS Einzelsignifikanz
FROM Problem
WHERE Titel LIKE "%Francois Hollande%"
) AS TitelSignifikanzTable
GROUP
BY ProblemID
) AS TagsUndTitelSignifikanzTable
ON TagsSignifikanzQuery.ProblemID = TitelsignifikanzQuery.ProblemID;
我已经尝试了一段时间,但就是想不出应该在哪里插入派生的 table 的名字。谁能帮帮我?提前致谢!
编辑 - 解决方案,在 BK435 和 Drew 的帮助下:(参见第 7 行和最后 2 行)
SELECT * FROM (
SELECT ProblemID, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz FROM (
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Francois"
UNION ALL
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Hollande"
) AS TagsSignifikanzTable GROUP BY ProblemID
) As Alias1
JOIN (
SELECT ProblemID, SUM(Einzelsignifikanz) AS Titelsignifikanz FROM (
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois%"
UNION ALL
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Hollande%"
UNION ALL
SELECT ProblemID, 4 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois Hollande%"
) AS TitelSignifikanzTable GROUP BY ProblemID
) AS Alias2
ON Alias1.ProblemID = Alias2.ProblemID;
您应该在 join 之前放置一个别名,因为您为内部 select 而不是外部 select...
添加了别名
SELECT * FROM (
SELECT ProblemID, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz FROM (
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Francois"
UNION ALL
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Hollande"
) AS TagsSignifikanzTable GROUP BY ProblemID
) As Alias1
JOIN (
SELECT ProblemID, SUM(Einzelsignifikanz) AS Titelsignifikanz FROM (
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois%"
UNION ALL
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Hollande%"
UNION ALL
SELECT ProblemID, 4 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois Hollande%"
) AS TitelSignifikanzTable GROUP BY ProblemID
)
AS TagsUndTitelSignifikanzTable ON TagsSignifikanzQuery.ProblemID = TitelsignifikanzQuery.ProblemID;
首先考虑这个(根据您对@BK435 的评论,您已删除):
create table t1
( id int auto_increment primary key,
stuff1 varchar(100) not null,
stuff2 varchar(100) not null
);
insert t1 (stuff1,stuff2) values ('111.1','111.2'),('111.3','111.4'),('111.5','111.6');
create table t2
( id int auto_increment primary key,
stuff1 varchar(100) not null,
stuff2 varchar(100) not null
);
insert t2 (stuff1,stuff2) values ('222.1','222.2'),('222.3','222.4'),('222.5','222.6');
select *
from t1
join t2
on t2.id=t1.id;
+----+--------+--------+----+--------+--------+
| id | stuff1 | stuff2 | id | stuff1 | stuff2 |
+----+--------+--------+----+--------+--------+
| 1 | 111.1 | 111.2 | 1 | 222.1 | 222.2 |
| 2 | 111.3 | 111.4 | 2 | 222.3 | 222.4 |
| 3 | 111.5 | 111.6 | 3 | 222.5 | 222.6 |
+----+--------+--------+----+--------+--------+
select * 发生的事情是它从两个 table 的连接中获取所有内容。它是真实的 table 还是带有别名的派生 table 并不重要。
我在两个 table 中也有相同的列名,以显示没有使用列别名的问题。下面将解决这个问题:
select t1.id,
t1.stuff1 as 1stuff1,t1.stuff2 as 1stuff2,t2.stuff1 as 2stuff1,t2.stuff2 as 2stuff2
from t1
join t2
on t2.id=t1.id;
+----+---------+---------+---------+---------+
| id | 1stuff1 | 1stuff2 | 2stuff1 | 2stuff2 |
+----+---------+---------+---------+---------+
| 1 | 111.1 | 111.2 | 222.1 | 222.2 |
| 2 | 111.3 | 111.4 | 222.3 | 222.4 |
| 3 | 111.5 | 111.6 | 222.5 | 222.6 |
+----+---------+---------+---------+---------+
现在回到 BK435 所做的。它给第一个派生的 table 一个别名,所以你得到了那个错误,它启发了我们 TagsSignifikanzQuery
从左字段中出来,未知,并在那里导致错误的错误。
假设 BK 首先运行此程序,结果为空白 tables:
create table problemtag
( problemid int not null,
tagtext varchar(100) not null
);
create table problem
( problemid int not null,
Einzelsignifikanz int not null,
titel varchar(100) not null
);
然后运行他的查询。这是错误:
Error Code: 1054. Unknown column 'TagsSignifikanzQuery.ProblemID' in
'on clause'
因此,当您加入 a、b、c、d 等(真实的或派生的 table)时,它会依靠 on clause
将您正在工作的那个加入其中如果你愿意的话,与已经在连接折叠中的(真实的或派生的)table 有某种关系。但是 TagsSignifikanzQuery
不是。这就像有人把希腊语放在英语句子的末尾。数据库引擎就像 'huh?'
编辑(以说明您在上面 Pink/Peach 中的最后一个错误)
create table t1
( id int auto_increment primary key,
stuff1 varchar(50) not null
);
insert t1 (stuff1) values ('111.1'),('111.2'),('111.3');
create table t2
( id int auto_increment primary key,
stuff2 varchar(50) not null
);
insert t2 (stuff2) values ('222.1'),('222.2'),('222.3');
create table t3
( id int auto_increment primary key,
stuff3 varchar(50) not null
);
insert t3 (stuff3) values ('333.1'),('333.2'),('333.3');
A1:显式加入
select t1.id,t1.stuff1,t2.stuff2
from t1
join t2
on t2.id=t1.id;
+----+--------+--------+
| id | stuff1 | stuff2 |
+----+--------+--------+
| 1 | 111.1 | 222.1 |
| 2 | 111.2 | 222.2 |
| 3 | 111.3 | 222.3 |
+----+--------+--------+
A2:和你一样的错误(错误:1054)
select t1.id,t1.stuff1,t2.stuff2
from t1
join t2
on t3.id=t1.id;
+----+--------+--------+
| id | stuff1 | stuff2 |
+----+--------+--------+
| 1 | 111.1 | 222.1 |
| 2 | 111.2 | 222.2 |
| 3 | 111.3 | 222.3 |
+----+--------+--------+
错误 1054 (42S22):'on clause'
中的未知列 't3.id'
为什么我的错误和你的一样?因为在我的例子中,select/join 不知道我在说什么 t3,因为它唯一介绍的是 t1 和 t2,我什至还没有完成 t2 的 on clause
.我正在引用 t3(它作为 table 存在)。
您很可能有一个 TagSignifikanzQuery table。但这就像我在连接上下文中的 t3 一样。也就是说,数据库引擎没有被正确输入。您需要完成引入 t2 的 on clause
。然后,如果需要,继续加入 TagsSignifikanzQuery。
但是写错了
编辑2:
在您的评论中:
... 在查询 "SELECT * FROM Table1 JOIN Table2" 中不需要 AS 子句,尽管我会说你 select 数据来自以前不存在的连接 table,我。 e.派生table。但是 MySQL 错误变为 "a derived table always needs an alias" 左右,但它似乎不适用于加入的 tables。诚然,一个别名在一个joined table 中是没有必要的,但错误似乎是一个错误的声明。或者加入的 tables 不被认为是派生的 tables? -- 来自 P.M.
德鲁回应:
在你从头到尾写的 "which was not there before" 中,从我的角度来看,它只是在它自己的上下文中,与任何其他代码片段无关,或者该代码已被修改一些其他状态未显示,则 Table1 和 Table2 确实存在,否则连接将失败。对吧?
在你写的最后三分之一中,我会这样说:table 要么是真实的,要么是派生的。如果它是派生的,则需要一个名称,如 http://pastie.org/10379926 in lines 32 and 34 for an Answer I wrote up for this question: http://tinyurl.com/nhsmmyx
所示
在第 34 行,我不得不扑通一声 y。或者我可以说 "as y" 但我很懒。我会争辩说我什至根本不必做 "y",因为我最外层的 select 里面所有的东西只是最后的润色,只是应该懒洋洋地给我列整个内部并完成它。但是 mysql 给了我 "Error Code 1248: Every derived table must have its own alias" 如果我不这样做。
我在第 27 行做 "t"(或者我可以说 "as t")的原因是因为我很懒,会在第 33 行依赖它,太懒了” ... 和 thing1.theDate<=x.xDate".
希望对您有所帮助。
我有一个或多或少复杂的 MySQL select 查询,它基本上是来自两个复杂 tables:
的连接的 select SELECT *
FROM
( SELECT ProblemID
, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz
FROM
( SELECT ProblemID
FROM Problemtag
WHERE Tagtext = "Francois"
UNION
ALL
SELECT ProblemID
FROM Problemtag
WHERE Tagtext = "Hollande"
) AS TagsSignifikanzTable
GROUP
BY ProblemID
)
JOIN
( SELECT ProblemID
, SUM(Einzelsignifikanz) AS Titelsignifikanz
FROM
( SELECT ProblemID
, 1 AS Einzelsignifikanz
FROM Problem
WHERE Titel LIKE "%Francois%"
UNION
ALL
SELECT ProblemID
, 1 AS Einzelsignifikanz
FROM Problem
WHERE Titel
LIKE "%Hollande%"
UNION
ALL
SELECT ProblemID
, 4 AS Einzelsignifikanz
FROM Problem
WHERE Titel LIKE "%Francois Hollande%"
) AS TitelSignifikanzTable
GROUP
BY ProblemID
) AS TagsUndTitelSignifikanzTable
ON TagsSignifikanzQuery.ProblemID = TitelsignifikanzQuery.ProblemID;
我已经尝试了一段时间,但就是想不出应该在哪里插入派生的 table 的名字。谁能帮帮我?提前致谢!
编辑 - 解决方案,在 BK435 和 Drew 的帮助下:(参见第 7 行和最后 2 行)
SELECT * FROM (
SELECT ProblemID, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz FROM (
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Francois"
UNION ALL
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Hollande"
) AS TagsSignifikanzTable GROUP BY ProblemID
) As Alias1
JOIN (
SELECT ProblemID, SUM(Einzelsignifikanz) AS Titelsignifikanz FROM (
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois%"
UNION ALL
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Hollande%"
UNION ALL
SELECT ProblemID, 4 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois Hollande%"
) AS TitelSignifikanzTable GROUP BY ProblemID
) AS Alias2
ON Alias1.ProblemID = Alias2.ProblemID;
您应该在 join 之前放置一个别名,因为您为内部 select 而不是外部 select...
添加了别名SELECT * FROM (
SELECT ProblemID, 10*POWER(COUNT(ProblemID), 2) AS TagsSignifikanz FROM (
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Francois"
UNION ALL
SELECT ProblemID FROM Problemtag WHERE Tagtext = "Hollande"
) AS TagsSignifikanzTable GROUP BY ProblemID
) As Alias1
JOIN (
SELECT ProblemID, SUM(Einzelsignifikanz) AS Titelsignifikanz FROM (
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois%"
UNION ALL
SELECT ProblemID, 1 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Hollande%"
UNION ALL
SELECT ProblemID, 4 AS Einzelsignifikanz FROM Problem WHERE Titel LIKE "%Francois Hollande%"
) AS TitelSignifikanzTable GROUP BY ProblemID
)
AS TagsUndTitelSignifikanzTable ON TagsSignifikanzQuery.ProblemID = TitelsignifikanzQuery.ProblemID;
首先考虑这个(根据您对@BK435 的评论,您已删除):
create table t1
( id int auto_increment primary key,
stuff1 varchar(100) not null,
stuff2 varchar(100) not null
);
insert t1 (stuff1,stuff2) values ('111.1','111.2'),('111.3','111.4'),('111.5','111.6');
create table t2
( id int auto_increment primary key,
stuff1 varchar(100) not null,
stuff2 varchar(100) not null
);
insert t2 (stuff1,stuff2) values ('222.1','222.2'),('222.3','222.4'),('222.5','222.6');
select *
from t1
join t2
on t2.id=t1.id;
+----+--------+--------+----+--------+--------+
| id | stuff1 | stuff2 | id | stuff1 | stuff2 |
+----+--------+--------+----+--------+--------+
| 1 | 111.1 | 111.2 | 1 | 222.1 | 222.2 |
| 2 | 111.3 | 111.4 | 2 | 222.3 | 222.4 |
| 3 | 111.5 | 111.6 | 3 | 222.5 | 222.6 |
+----+--------+--------+----+--------+--------+
select * 发生的事情是它从两个 table 的连接中获取所有内容。它是真实的 table 还是带有别名的派生 table 并不重要。
我在两个 table 中也有相同的列名,以显示没有使用列别名的问题。下面将解决这个问题:
select t1.id,
t1.stuff1 as 1stuff1,t1.stuff2 as 1stuff2,t2.stuff1 as 2stuff1,t2.stuff2 as 2stuff2
from t1
join t2
on t2.id=t1.id;
+----+---------+---------+---------+---------+
| id | 1stuff1 | 1stuff2 | 2stuff1 | 2stuff2 |
+----+---------+---------+---------+---------+
| 1 | 111.1 | 111.2 | 222.1 | 222.2 |
| 2 | 111.3 | 111.4 | 222.3 | 222.4 |
| 3 | 111.5 | 111.6 | 222.5 | 222.6 |
+----+---------+---------+---------+---------+
现在回到 BK435 所做的。它给第一个派生的 table 一个别名,所以你得到了那个错误,它启发了我们 TagsSignifikanzQuery
从左字段中出来,未知,并在那里导致错误的错误。
假设 BK 首先运行此程序,结果为空白 tables:
create table problemtag
( problemid int not null,
tagtext varchar(100) not null
);
create table problem
( problemid int not null,
Einzelsignifikanz int not null,
titel varchar(100) not null
);
然后运行他的查询。这是错误:
Error Code: 1054. Unknown column 'TagsSignifikanzQuery.ProblemID' in 'on clause'
因此,当您加入 a、b、c、d 等(真实的或派生的 table)时,它会依靠 on clause
将您正在工作的那个加入其中如果你愿意的话,与已经在连接折叠中的(真实的或派生的)table 有某种关系。但是 TagsSignifikanzQuery
不是。这就像有人把希腊语放在英语句子的末尾。数据库引擎就像 'huh?'
编辑(以说明您在上面 Pink/Peach 中的最后一个错误)
create table t1
( id int auto_increment primary key,
stuff1 varchar(50) not null
);
insert t1 (stuff1) values ('111.1'),('111.2'),('111.3');
create table t2
( id int auto_increment primary key,
stuff2 varchar(50) not null
);
insert t2 (stuff2) values ('222.1'),('222.2'),('222.3');
create table t3
( id int auto_increment primary key,
stuff3 varchar(50) not null
);
insert t3 (stuff3) values ('333.1'),('333.2'),('333.3');
A1:显式加入
select t1.id,t1.stuff1,t2.stuff2
from t1
join t2
on t2.id=t1.id;
+----+--------+--------+
| id | stuff1 | stuff2 |
+----+--------+--------+
| 1 | 111.1 | 222.1 |
| 2 | 111.2 | 222.2 |
| 3 | 111.3 | 222.3 |
+----+--------+--------+
A2:和你一样的错误(错误:1054)
select t1.id,t1.stuff1,t2.stuff2
from t1
join t2
on t3.id=t1.id;
+----+--------+--------+
| id | stuff1 | stuff2 |
+----+--------+--------+
| 1 | 111.1 | 222.1 |
| 2 | 111.2 | 222.2 |
| 3 | 111.3 | 222.3 |
+----+--------+--------+
错误 1054 (42S22):'on clause'
中的未知列 't3.id'为什么我的错误和你的一样?因为在我的例子中,select/join 不知道我在说什么 t3,因为它唯一介绍的是 t1 和 t2,我什至还没有完成 t2 的 on clause
.我正在引用 t3(它作为 table 存在)。
您很可能有一个 TagSignifikanzQuery table。但这就像我在连接上下文中的 t3 一样。也就是说,数据库引擎没有被正确输入。您需要完成引入 t2 的 on clause
。然后,如果需要,继续加入 TagsSignifikanzQuery。
但是写错了
编辑2:
在您的评论中:
... 在查询 "SELECT * FROM Table1 JOIN Table2" 中不需要 AS 子句,尽管我会说你 select 数据来自以前不存在的连接 table,我。 e.派生table。但是 MySQL 错误变为 "a derived table always needs an alias" 左右,但它似乎不适用于加入的 tables。诚然,一个别名在一个joined table 中是没有必要的,但错误似乎是一个错误的声明。或者加入的 tables 不被认为是派生的 tables? -- 来自 P.M.
德鲁回应:
在你从头到尾写的 "which was not there before" 中,从我的角度来看,它只是在它自己的上下文中,与任何其他代码片段无关,或者该代码已被修改一些其他状态未显示,则 Table1 和 Table2 确实存在,否则连接将失败。对吧?
在你写的最后三分之一中,我会这样说:table 要么是真实的,要么是派生的。如果它是派生的,则需要一个名称,如 http://pastie.org/10379926 in lines 32 and 34 for an Answer I wrote up for this question: http://tinyurl.com/nhsmmyx
所示在第 34 行,我不得不扑通一声 y。或者我可以说 "as y" 但我很懒。我会争辩说我什至根本不必做 "y",因为我最外层的 select 里面所有的东西只是最后的润色,只是应该懒洋洋地给我列整个内部并完成它。但是 mysql 给了我 "Error Code 1248: Every derived table must have its own alias" 如果我不这样做。
我在第 27 行做 "t"(或者我可以说 "as t")的原因是因为我很懒,会在第 33 行依赖它,太懒了” ... 和 thing1.theDate<=x.xDate".
希望对您有所帮助。