Как сделать EXISTS выбрать в ANSI SQL - PullRequest
2 голосов
/ 22 мая 2011

Существует ли кросс-база данных (по крайней мере, SQL Server, Oracle, Postgre, MySQL, SQLite) способ сделать то, что я бы сделал в T-SQL, используя

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

Кажется, что это недопустимый синтаксис ANSI SQL, потому что нет предложения FROM. В настоящее время я использую COUNT (*) для этого, но я не думаю, что это оптимально.

Ответы [ 3 ]

4 голосов
/ 22 мая 2011

Подзапрос не нужен - используйте:

SELECT DISTINCT 
       1 
  FROM Foo 
 WHERE Bar = 'Quux'

Более сложная версия с использованием агрегатов и выражения CASE:

SELECT CASE
         WHEN COUNT(*) >= 1 THEN 1 
         ELSE 0
       END
  FROM Foo 
 WHERE Bar = 'Quux'
1 голос
/ 22 мая 2011

Немного измены, но это должно сработать, и DISTINCT 1 FROM Foo должна быть тривиально оптимизирована всеми, кроме самых глупых СУБД!

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

0 голосов
/ 22 мая 2011

Просто используйте COUNT, пока вам не понадобится иначе. При условии хорошей селективности по Bar и index, это не будет иметь большого значения, но будет гораздо более читабельным

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

Разумеется, вы обменяете оптимизацию на мобильность, поэтому в этом случае используйте COUNT

...