【问题标题】:sql select statement giving more rows then records in tablessql select语句给出更多行然后在表中记录
【发布时间】:2010-10-12 15:03:43
【问题描述】:

错误很简单。

有 3 个表,

让我们将它们命名为 A、B、C - 它们都有 7 行。

A有以下数据

1 2 3 4 5 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 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

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

【问题讨论】:

  • 与其混淆您的示例,不如调试更多“真实世界”示例更容易。就目前而言,我很困惑。
  • 因为您在 FROM 子句中使用了此构造:“from A,B,C”您将在结果中获得 7x7x7 行 (343),因为该构造创建了笛卡尔连接。请改用 INNER JOIN(有关详细信息,请参阅 devshed.com/c/a/MySQL/Understanding-SQL-Joins
  • 您的查询产生了叉积,因为连接子句不明确。对于 A 中的每一行,B 中有 7 个匹配行,对于 B 中的每一行,C 中有 7 个匹配行。正如 Leslie 所指出的,7x7x7 是 343,这是所写查询的正确行数。跨度>

标签: sql mysql oracle


【解决方案1】:

试试:

select col1 from a
union
select col1 from b
union
select col1 from c

【讨论】:

    【解决方案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 组合

    【讨论】:

      【解决方案3】:

      鉴于您的查询正是您应该得到的 - 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;
      

      分享和享受。

      【讨论】:

      • Drat - 没有看到 @Leslie 对原始帖子的评论。好吧,也许这增加了足够的价值来避免投票。
      【解决方案4】:

      您可以使用这样的子查询将必须声明 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;
      

      查询优化器应该能够在执行 UNION ALL 之前对每个表适当地应用过滤器。

      编辑:固定为由@jeffrey-kemp 突出显示的 id 约束)

      【讨论】:

      • 这只会产生一行:5。也许您是要查询 ID?
      • 谢谢 Jeffrey,我的 SQL 生锈了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多