Oracle
如何在不掃描整個表的情況下檢查 Oracle 中的存在?
通常,要檢查 Oracle 中的存在,我會這樣做:
SELECT COUNT(1) FROM foo WHERE bar = 'baz'
但是,如果
foo
表包含多行 wherebar='baz'
,則此查詢不必要地掃描整個表以報告總計數。如何快速檢查表中的列是否包含至少一個具有指定值的行,並使查詢短路,以便一旦檢測到該值存在,查詢將停止並返回,而不是掃描整個表?
理想情況下,無論表中有多少行包含該值,我都希望此查詢返回一個標量值。
以下解決方案似乎是短路的(與 相比
SELECT COUNT(1)
,這對於大表來說要快得多),但是如果值存在,它將返回 1,或者如果值不存在,則根本不返回任何行。如果總是返回一行會更好。SELECT 1 FROM DUAL WHERE EXISTS ( SELECT 1 FROM foo WHERE bar = 'baz' )
只需將兩者結合起來:
SELECT count(*) FROM DUAL WHERE EXISTS ( SELECT 1 FROM foo WHERE bar = 'baz' )
除了 Balazs 對您的查詢的自然改進之外,以下內容應該有效
select count(*) from foo where bar='baz' and rownum=1