如何在ANSI SQL中选择EXISTS

时间:2011-05-22 15:24:21

标签: sql ansi-sql

是否存在跨数据库(至少SQL Server,Oracle,Postgre,MySQL,SQLite)使用

在T-SQL中执行的操作方式
SELECT 1 WHERE EXISTS (SELECT * FROM Foo WHERE Bar = 'Quux')

似乎这不是有效的ANSI SQL语法,因为没有FROM子句。目前我使用COUNT(*)来做这件事,但我认为这不是最佳的。

3 个答案:

答案 0 :(得分:4)

子查询是不必要的 - 使用:

SELECT DISTINCT 
       1 
  FROM Foo 
 WHERE Bar = 'Quux'

更复杂的版本,使用聚合和&案例表达:

SELECT CASE
         WHEN COUNT(*) >= 1 THEN 1 
         ELSE 0
       END
  FROM Foo 
 WHERE Bar = 'Quux'

答案 1 :(得分:1)

作弊一点,但这应该有效,DISTINCT 1 FROM Foo应该被除了最愚蠢的DBMS之外的所有人优化!

SELECT DISTINCT 1 FROM Foo WHERE EXISTS (SELECT * FROM Foo WHERE Bar = 'Quux')

答案 2 :(得分:0)

除非您需要,否则请使用COUNT。假设对Bar和index有很好的选择性,那就没那么重要了,但会更具可读性

SELECT COUNT(Bar) FROM Foo WHERE Bar = 'Quux'

当然,您将交换优化以实现可移植性,因此在这种情况下使用COUNT