SELECT
...
FROM
your_table AS outer_table
WHERE
...
AND EXISTS (
SELECT
1
FROM (
-- This subquery is working as a LATERAL, so follow the same structure.
SELECT
condition_row
FROM
inner_table
WHERE
...
-- Make sure the subquery is referencing the required entries. (for example if the result blunges to the same account)
AND inner_table.reference=outer_table.reference
-- If applying any ordering.
ORDER BY inner_events.ordering_row ASC
LIMIT 1
) AS subquery
where
-- Check if the rest of the EXISTS condition here.
your_condition=subquery.condition_row
);
4条答案
按热度按时间zpgglvta1#
EXISTS()
的目的是执行查询 * 直到 * 它可以确定该表中是否有 * 任何 * 行匹配WHERE
子句。也就是说,它在逻辑上与LIMIT 1
做同样的事情。EXISTS
在某些圈子中可能被称为semi-join
。底线是:不要在
EXISTS()
中使用LIMIT 1
。补遗:正如保罗指出的,
LIMIT
* 和OFFSET
(或LIMIT m,n
)确实有意义。jrcvhitl2#
稍微摆弄一下我的查询,我注意到如果
LIMIT
设置为0,EXISTS
仍然返回1。我想这表明它被忽略了。xytpbqjk3#
这取决于你的表(my_table)中有多少条记录。如果记录不是太多,那么你不会看到任何性能提高,但如果你的表有太多的记录,那么你会看到性能提高,但这也取决于许多因素,因为你在列中有索引,这些索引正在被用于选择(如果你这样做,那么你也会得到覆盖索引的好处)。
qrjkbowd4#
这个问题已经提出很久了。如果有人需要一个变通办法,我发布了一个解决方案。
如上所述,限制在EXISTS块中被消除。但是,如果我们使用子查询作为EXISTS的主查询,我们可以将LIMIT应用于子查询。在本例中,子查询的工作方式类似于LATERAL,它为条件提供数据。