sql - 如何有效地检索一对多关系中的数据

标签 sql db2 sql-execution-plan

我遇到了一个问题,我需要运行一个查询,该查询应该从主表中获取一些行,并且如果主表的键存在于子表中(一对多关系),则有一个指示符。

查询可能是这样的:

select a.index, (select count(1) from second_table b where a.index = b.index) 
from first_table a;

这样我会得到我想要的结果(0 = second_table 中没有依赖记录,否则有),但我正在为我从数据库中获得的每条记录运行一个子查询。我需要为至少三个相似的表获得这样的指标,并且主查询已经是至少两个表之间的一些内部连接......

我的问题是是否有一些真正有效的方法来处理这个问题。我曾想过在新列“first_table”中记录记录,但 dbadmin 不允许触发器,并且通过代码跟踪它风险太大。

解决这个问题的好方法是什么?

此查询的应用将用于两件事:
  • 指示 first_table 中的给定行至少存在 second_table 中的一行。它是在一个列表中表明它。如果第二个表中不存在任何行,我将不会打开此指示器。
  • 搜索 first_table 中在 second_table 中至少有一行的所有行,或者在第二个表中没有行。

  • 我刚刚发现的另一个选择:
    select a.index, b.index 
    from first_table a 
    left join (select distinct(index) as index from second_table) b on a.index = b.index
    

    这样,如果 b.index 不存在,我将为它获取 null(最终可以调整显示,我担心这里的查询性能)。

    这个问题的最终目标是为这种情况找到合适的设计方法。这种情况经常发生,一个真正的应用程序可能是一个 POS 系统,它显示所有客户,并在列表中有一个图标作为客户是否有未结订单的指示器。

    最佳答案

    我想尝试使用 EXISTS,对于这种情况,它可能比连接表更好。在我的 oracle db 上,它的执行时间比示例查询稍好,但这可能是特定于 db 的。

    SELECT first_table.ID, CASE WHEN EXISTS (SELECT * FROM second_table WHERE first_table.ID = second_table.ID) THEN 1 ELSE 0 END FROM first_table
    

    关于sql - 如何有效地检索一对多关系中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17106854/

    相关文章:

    sql - 将列添加到架构中的多个表

    java - 找不到 KeyStore 的 DB2 DataSource 属性

    java - Hibernate 标准在 Web 应用程序中花费的时间太长,但在 SQLPlus 中却很快?

    SQL 通配符 : performance overhead?

    从两列中删除重复的 SQL

    mysql - 使用 SQL INNER JOIN 批量更新字段

    java - DB2 JDBC 创建 clob 错误

    sql - 使用 PK 反馈循环复制行

    sql - Microsoft 的数据库命名约定?

    sql - 可以禁用 Oracle 中的 SQL 执行计划吗?