MySQL CROSS JOIN:每个派生表必须有自己的别名

时间:2016-05-27 14:22:43

标签: mysql

我正在尝试在两个表中的“Selected”列之间进行CROSS JOIN, 例如:表1(a,b,c) - 表2(a,b,d) 我想从每个表中选择ab,然后加入它们,但我一直收到此错误:

 Every derived table must have its own alias

我知道这是因为我需要命名任何派生表,但我仍然无法确定问题是什么以及如何在线搜索后修复它。这是查询:

 SELECT  (x.targetNumber, x.name, x.lat, x.lng) 
 FROM    ((SELECT (u.name, u.targetNumber, u.password) 
          FROM Users AS u WHERE 'target' = u.type) 
          CROSS JOIN 
          (SELECT (l.targetNumber, l.password, l.lat, l.lng) FROM Location AS l)
          WHERE (u.targetNumber = l.targetNumber AND u.password = l.password )) AS x;

2 个答案:

答案 0 :(得分:2)

到目前为止,您的查询似乎应该是这样的:

select u.targetnumber, u.name, l.lat, l.lng
from users u
join location l on l.targetNumber = u.targetNumber and l.password = u.password
where u.type = 'target';

只是你想要应用一些技巧来强制DBMS遵循你认为最好的执行计划。这样做会使您的查询完全无法读取并引入错误。

如您所见,没有交叉连接。您根本不想要获得两个数据集的所有可能组合 - 这就是交叉连接。

无论如何,这不是SQL的工作原理。你要编写直截了当的查询告诉DBMS 要做什么。 DBMS然后决定如何来做它。

答案 1 :(得分:1)

简短的回答是将FROM Location AS l)之后的右括号移到as的正前方,并从子查询的选择列表中删除别名:

...(SELECT targetNumber, password, lat, lng FROM Location) AS l...

稍微长一点的答案:我甚至不理解你为什么在from子句中有子查询。你可以简单地加入这两个表。