如何在一对多关系中有效地检索数据

Mar*_*tin 5 sql db2 sql-execution-plan

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

查询可能是这样的:

select a.index, (select count(1) from second_table b where a.index = b.index) 
from first_table a;
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,是否有一些非常有效的方法来处理这个问题.我曾想过将记录保存在新列"first_table"中,但dbadmin不允许触发器并通过代码跟踪它是太冒险了.

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

此查询的应用程序将用于两件事:

  1. 指示first_table中给定行的second_table中至少存在一行.它是在列表中指出它.如果第二个表中没有行,我将不会打开此指示器.
  2. 要搜索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
Run Code Online (Sandbox Code Playgroud)

这样,如果b.index不存在,我将得到null(显示最终可以调整,我在这里关注查询性能).

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

Mik*_*ail 6

我想,尝试使用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
Run Code Online (Sandbox Code Playgroud)