我有 2 个表:table_a 和 table_b。两者都包含一个名为“open”的列。
table_a
+-------+
| open |
+-------+
| 36.99 |
| 36.85 |
| 36.40 |
| 36.33 |
| 36.33 |
+-------+
table_b
+------+
| open |
+------+
| 4.27 |
| 4.46 |
| 4.38 |
| 4.22 |
| 4.18 |
+------+
我想编写一个返回以下内容的查询
+-------++------+
| open || open |
+-------++------+
| 36.99 || 4.27 |
| 36.85 || 4.46 |
| 36.40 || 4.38 |
| 36.33 || 4.22 |
| 36.33 || 4.18 |
+-------++------+
我尝试以下查询:
select a.open, b.open from table_a a, table_b b;
这将返回一个表,其中包含 table_b.open 的每个值和 table_a.open 的每个值
+-------++------+
| open || open |
+-------++------+
| 36.99 || 4.27 |
| 36.99 || 4.46 |
| 36.99 || 4.38 |
| 36.99 || 4.22 |
| ... || 4.18 |
+ ... ++------+
我可以看到我在这里误解了别名的正确用法。有任何想法吗?
这不是您遇到的别名问题。你正在执行一个CROSS JOIN http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join在创建笛卡尔结果集的表上。
这会乘以您的结果集,因此每一行table_a
直接匹配到每一行table_b
.
如果你想JOIN
将表放在一起,那么您需要一些列来连接表。
如果您有专栏要JOIN
打开,那么您的查询将是:
select a.open as a_open,
b.open as b_open
from table_a a
inner join table_b b
on a.yourCol = b.yourCol
如果您没有可用于连接的列,那么您可以创建一个用户定义的变量来执行此操作,这将为每行创建一个行号。
select
a.open a_open,
b.open b_open
from
(
select open, a_row
from
(
select open,
@curRow := @curRow + 1 AS a_row
from table_a
cross join (SELECT @curRow := 0) c
) a
) a
inner join
(
select open, b_row
from
(
select open,
@curRow := @curRow + 1 AS b_row
from table_b
cross join (SELECT @curRow := 0) c
) b
) b
on a.a_row = b.b_row;
See SQL 摆弄演示 http://www.sqlfiddle.com/#!2/9b1b1/29
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)