sql select语句在表中提供比记录更多的行

sql select语句在表中提供比记录更多的行,sql,mysql,oracle,Sql,Mysql,Oracle,错误很简单 有三张桌子 让我们把它们命名为A、B、C——它们都有7行 A有以下数据 一, 2. 3. 4. 5. 6. 七, Id=1时 B有以下数据 八, 9 10 11 12 13 十四, Id=1时 C有以下数据 十五 16 17 18 19 20 二十一, 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的简单数字,如: 一, 2

错误很简单

有三张桌子

让我们把它们命名为A、B、C——它们都有7行

A有以下数据

一, 2. 3. 4. 5. 6. 七,

Id=1时

B有以下数据

八, 9 10 11 12 13 十四,

Id=1时

C有以下数据

十五 16 17 18 19 20 二十一,

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的简单数字,如:

一, 2. 3. 4. 5. 6. 7. 8. 9 10 11 12 13 14 15 16 17 18 19 20 二十一,

请帮我摆脱这个麻烦,并向我建议一个微调查询。

试试:

select col1 from a
union
select col1 from b
union
select col1 from c
尝试:


你可以用工会?e、 g.如果是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的组合

你可以使用联合体吗?e、 g.如果是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的组合

您可以使用这样的子查询将必须声明col1=x的位置数减少到一个

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;
在执行UNIONALL之前,查询优化器应该能够在每个表上适当地应用过滤器


编辑:修复了由@jeffrey kemp照亮的按id约束。您可以使用这样的子查询将必须声明col1=X的位置数减少为一个

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;
在执行UNIONALL之前,查询优化器应该能够在每个表上适当地应用过滤器


编辑:修复了由@jeffrey kemp照亮的按id约束的问题,因为您的查询正好是您应该得到的-343行=7*7*7。因为每个表中的所有行都具有相同的ID 1,所以您的问题中的查询相当于对表进行笛卡尔连接,即不使用WHERE子句的查询,其中每个表中的所有行都连接到其他表的所有行,类似于

SELECT A.COL1, B.COL1, C.COL1
  FROM A, B, C;
正如其他人所建议的,联合是一种很好的方式来获得您想要的,因为您似乎并没有真正尝试将行中的信息连接在一起:

SELECT COL1 FROM A
UNION ALL
SELECT COL1 FROM B
UNION ALL
SELECT COL1 FROM C;

分享和享受。

根据您的查询,您应该得到-343行=7*7*7。因为每个表中的所有行都具有相同的ID 1,所以您的问题中的查询相当于对表进行笛卡尔连接,即不使用WHERE子句的查询,其中每个表中的所有行都连接到其他表的所有行,类似于

SELECT A.COL1, B.COL1, C.COL1
  FROM A, B, C;
正如其他人所建议的,联合是一种很好的方式来获得您想要的,因为您似乎并没有真正尝试将行中的信息连接在一起:

SELECT COL1 FROM A
UNION ALL
SELECT COL1 FROM B
UNION ALL
SELECT COL1 FROM C;

分享并享受。

与其混淆您的示例,不如调试更多的真实示例。就目前而言,我感到困惑。因为您在FROM子句中使用了这个构造:从A、B、C,您将在结果中得到7x7x7行343,因为该构造创建了笛卡尔连接。使用内部联接,请参阅以了解更多详细信息。由于联接子句不明确,您的查询正在生成叉积。对于A中的每一行,B中有7个匹配行,而对于B中的每一行,C中有7个匹配行。正如Leslie所指出的,7x7x7是343,这是编写的查询的正确行数。与其混淆示例,不如调试更真实的示例。就目前而言,我感到困惑。因为您在FROM子句中使用了这个构造:从A、B、C,您将在结果中得到7x7x7行343,因为该构造创建了笛卡尔连接。使用内部联接,请参阅以了解更多详细信息。由于联接子句不明确,您的查询正在生成叉积。对于A中的每一行,B中有7个匹配行,而对于B中的每一行,C中有7个匹配行。如Leslie所述,7x7x7是343,这是所写查询的正确行数。这将只产生一行:5。也许你想查询ID?谢谢Jeffrey,我的SQL已经生锈了。这只会导致一行:5。也许你想查询ID?谢谢Jeffrey,我的SQL已经生锈了。Drat-没有看到@Leslie在原始帖子上的评论。好吧,也许这增加了足够的价值来避免被否决。Drat-没有看到@Leslie在原始帖子上的评论。好吧,也许这会增加足够的价值,避免被否决。