错误非常简单。
有3个表,
让我们将它们命名为A,B,C - 所有这些都有7行。
A有以下数据
1 2 3 4 五 6 7
Id = 1
B有以下数据
8 9 10 11 12 13 14
Id = 1
C具有以下数据
15 16 17 18 19 20 21
Id = 1
现在我选择它们:从A,B,C中选择A.col1,B.col1,C.col1,其中A.ID = B.ID和C.ID = A.ID和B.ID = C .ID。
所以即将到来的输出是343。
现在我想要输出的只是1到21之间的数字,如:
1 2 3 4 五 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
请帮助我解决这个问题并建议我进行微调查询。
答案 0 :(得分:3)
尝试:
select col1 from a
union
select col1 from b
union
select col1 from c
答案 1 :(得分:2)
您可以使用UNION吗?例如如果它是ID 5,你想用以下东西拉回来:
SELECT col1
FROM A
WHERE ID = 5
UNION
SELECT col1
FROM B
WHERE ID = 5
UNION
SELECT col1
FROM C
WHERE ID = 5;
这将把它们全部放在一个列中,而不是给你一个7 x 7 x7的组合
答案 2 :(得分:0)
您可以使用这样的子查询来减少必须将col1 = X指定为1的位置数。
SELECT col1 FROM
(
(SELECT id, col1 FROM A)
UNION ALL
(SELECT id, col1 FROM B)
UNION ALL
(SELECT id, col1 FROM C)
) AS ABC
WHERE id = 5;
查询优化器应该能够在执行UNION ALL之前在每个表上适当地应用过滤器。
编辑:修正了由@ jeffrey-kemp高亮显示的id约束
答案 3 :(得分:0)
鉴于你的查询正是你应该得到的 - 343行(= 7 * 7 * 7)。因为每个表中的所有行都具有相同的ID(1),所以问题中的查询等同于执行表的笛卡尔连接,即没有WHERE子句的查询,其中每个表中的所有行都连接到所有其他表的行 - 类似于
SELECT A.COL1, B.COL1, C.COL1
FROM A, B, C;
正如其他人所建议的那样,UNION是获得你想要的东西的好方法,因为你似乎并没有真正尝试从行中加入信息:
SELECT COL1 FROM A
UNION ALL
SELECT COL1 FROM B
UNION ALL
SELECT COL1 FROM C;
分享并享受。