我遇到了一个问题,我需要运行一个查询,该查询应该从主表中获取一些行,并且如果主表的键存在于子表中(一对多关系),则有一个指示符。
查询可能是这样的:
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 不允许触发器,并且通过代码跟踪它风险太大。
解决这个问题的好方法是什么?
此查询的应用将用于两件事:
我刚刚发现的另一个选择:
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/