如何在 ANSI SQL 中进行 EXISTS 选择

发布于 2024-11-08 15:32:34 字数 246 浏览 0 评论 0原文

是否有跨数据库(至少是 SQL Server、Oracle、Postgre、MySQL、SQLite)的方式来执行我在 T-SQL 中执行的操作,

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

这似乎不是有效的 ANSI SQL 语法,因为没有 FROM 子句。目前我正在使用 COUNT(*) 来执行此操作,但我认为这不是最佳选择。

Is there a cross-database (at least SQL Server, Oracle, Postgre, MySQL, SQLite) way of doing what I would do in T-SQL using

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

It seems that this is not valid ANSI SQL syntax because there is no FROM clause. At present I am using COUNT(*) to do this, but I don't think that's optimal.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

盛装女皇 2024-11-15 15:32:34

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

SELECT DISTINCT 
       1 
  FROM Foo 
 WHERE Bar = 'Quux'

更复杂的版本,使用aggregates &案例表达:

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

The subquery is unnecessary - use:

SELECT DISTINCT 
       1 
  FROM Foo 
 WHERE Bar = 'Quux'

A more complicated version, using aggregates & CASE expression:

SELECT CASE
         WHEN COUNT(*) >= 1 THEN 1 
         ELSE 0
       END
  FROM Foo 
 WHERE Bar = 'Quux'
掩于岁月 2024-11-15 15:32:34

有点作弊,但这应该可以工作,并且除了最愚蠢的 DBMS 之外的所有 DBMS 都应该对 DISTINCT 1 FROM Foo 进行简单的优化!

从 Foo WHERE EXISTS 中选择 DISTINCT 1(SELECT * FROM Foo WHERE Bar = 'Quux')

Cheating a little, but this ought to work and the DISTINCT 1 FROM Foo should be trivially optimized by all but the dumbest of DBMSs!

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

若无相欠,怎会相见 2024-11-15 15:32:34

只需使用 COUNT 即可,除非您另有需要。假设对 Bar 和索引有良好的选择性,它不会太重要,但可读性会更高。

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

当然,您会为了可移植性而牺牲优化,因此在这种情况下使用 COUNT

Just use COUNT until you need otherwise. Assuming good selectivity on Bar and and index, it won't matter too much but will be far more readable

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

You will trade optimisation for portability of course, so in this case use COUNT

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文