我遇到了一个问题,我需要运行一个查询,该查询应该从主表中获取一些行,并且如果主表的键存在于子表中(一对多的关系),则有一个指示符。
查询可能是这样的:
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 系统来显示所有客户,并在列表中有一个图标作为客户是否有未结订单的指示器。