2011-05-22 3 views
2

Есть межбазовых (по крайней мере, SQL Server, Oracle, Postgre, MySQL, SQLite) способ делать то, что я хотел бы сделать в T-SQL, используяКак сделать СУЩЕСТВУЕТ выбрать в ANSI SQL

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

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

ответ

3

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

SELECT DISTINCT 
     1 
    FROM Foo 
WHERE Bar = 'Quux' 

более сложный вариант с использованием агрегатов & выражение СЛУЧАЙ:

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

Интересно, почему бы не использовать лимит, а не отдельный? Разве это не совместимо с ABSI? SELECT ОТ Foo WHERE Bar = 'Quux' LIMIT 1; –

1

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

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

0

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

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

Вы торгуете оптимизацию для портативности, конечно, поэтому в этом случае используйте COUNT

+1

Я работаю над библиотекой общего назначения, поэтому я хочу лучшее сочетание оптимального и портативного. И печенье! :) –

Смежные вопросы