【问题标题】:MySQL select, embedded cursorMySQL选择,嵌入式游标
【发布时间】:2014-01-02 05:18:00
【问题描述】:

例如,我有一个数据库,其中有两个表 QUESTIONS 和 ANSWERS。一个问题可以有多个答案,因此 QUESTIONS 表与 ANSWERS 表是一对多的关系。

在 Oracle 中选择一个问题,我可以在以下选择中写出所有答案:

select q.*,
       cursor (select a.*
               from ANSWRES a
               where a.question_id = q.question_id) as answers
from QUESTIONS q
where q.question_id = 123;

是否可以在 MySQL 数据库中编写类似的 select ?

如果不是,那么两个得到问题的替代方法是什么,所有的答案都使用一个选择?

【问题讨论】:

    标签: mysql oracle select cursor


    【解决方案1】:

    您应该可以使用join

    select q.*, a.*
    from QUESTIONS q left outer join
         ANSWERS a
         on a.question_id = q.question_id
    where q.question_id = 123;
    

    【讨论】:

    • 这在简单的情况下会有所帮助,但是当您有一些与多个表存在一对多关系的表时,我认为嵌入式游标在这种情况下是更清晰直观的解决方案。
    • @Yoh0xFF 。 . .虽然我不同意你的观点(因为 select 子句中的运算符会影响行数违反了 select 的“意图”),但更重要的问题是嵌入式游标是 Oracle 特有的,而这个答案是标准的应该适用于任何 SQL 数据库的 SQL 语法。
    • “具有多个详细信息的主”查询在普通 SQL 中是一个挑战。虽然您可以使用 JOIN 来获取所有相关数据,但这并不理想,因为各种明细表的行仅绑定到公共主表,但彼此不相关,因此它们仍然形成笛卡尔积。像这样的查询性能很差(不仅仅是在 MySQL 中),并且接收者处理起来会很痛苦。您可以使用 GROUP_CONCAT 通过聚合来模拟“嵌入式游标”。这将创建一个字符串列表,您可以在客户端中重新解析它,这可能会稍微不那么痛苦。另一种可行的方法是发送...
    • ...多个查询作为一个批次,并接收多个结果集(每个细节一个)。我觉得这与“嵌入式游标”相比具有优势,因为这是一种可移植的机制,既不依赖任何结果集解析,也不依赖任何特定的 API 来访问嵌入式游标提供的各个项目。
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多