sql select语句在表中提供更多行然后记录

时间:2010-10-12 15:03:44

标签: sql mysql oracle

错误非常简单。

有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

请帮助我解决这个问题并建议我进行微调查询。

4 个答案:

答案 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;

分享并享受。