当前位置: 首页 > 面试题库 >

使用Exists 1或Exists存在的子查询*

史高阳
2023-03-14
问题内容

我以前是这样写我的EXISTS检查的:

IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Where Columns=@Filters
END

前一世代的DBA告诉我,当我做一个EXISTS子句时,请使用SELECT 1而不是SELECT *

IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END

这真的有区别吗?


问题答案:

不,SQL Server很聪明,并且知道它已用于EXISTS,并且不向系统返回任何数据。

Quoth Microsoft:http ://technet.microsoft.com/en-
us/library/ms189259.aspx?ppud =4

由EXISTS引入的子查询的选择列表几乎总是由星号(*)组成。没有理由列出列名,因为您只是在测试是否存在满足子查询中指定条件的行。

要检查自己,请尝试运行以下命令:

SELECT whatever
  FROM yourtable
 WHERE EXISTS( SELECT 1/0
                 FROM someothertable 
                WHERE a_valid_clause )

如果它实际上在用SELECT列表做某事,它将以零错误抛出div。没有。

编辑:请注意,SQL标准实际上是在谈论这一点。

ANSI SQL
1992标准,第191页,http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

3)情况:
a)如果<select list>“ *”简单地包含在<subquery> 紧接在中的a中<exists predicate>,则<select list> a等于a<value expression> 是任意的<literal>



 类似资料:
  • 问题内容: 以下两个查询是子查询。两者相同,都对我有效。但是问题是方法1的查询大约需要10秒才能执行,而方法2的查询不到1秒。 我能够将方法1的查询转换为方法2,但是我不了解查询中正在发生什么。我一直想自己弄清楚。我真的很想了解以下两个查询之间的区别是什么,以及如何获得性能提升?它背后的逻辑是什么? 我是这些高级技术的新手。我希望有人能在这里帮助我。考虑到我阅读的文档并没有给我任何提示。 方法1:

  • 问题内容: 这两个查询都给出相同的输出,这在性能上明智的联接或带有existing子句的相关子查询中比较好,哪个更好。 编辑:-是否有供联接使用的alternet方式,以提高性能:-在上述2个查询中,我需要来自部门以及联系信息表的信息 问题答案: 通常,使用EXISTS子句是因为您可能需要DISTINCT进行JOIN才能提供预期的输出。例如,如果一行有多个Department行ContactInf

  • 问题内容: 给定m2m关系: 项目类别 我有三个表: 项 , 类别 和 items_categories 包含对两者的引用 我想找到属于 所有给定 类别集的项目: 我可以考虑通过两种方法在mySQL中完成此操作。 选项A:内联: 选项B:存在: 这两个选项都可以。问题是: 对于大型项目表,最快/最合适的 是 哪一个? 还是缺少OPTION CI? 问题答案: 选项A 与相比具有一个优势,因为它将更

  • 此外,您是否愿意指出任何好的教程,以编写复杂的查询在JPA。

  • 我正在尝试在pyspark中运行子查询。我发现可以使用SQL语句。但是,使用“where”或“filter”操作是否有任何内在的支持? 考虑测试数据框架: 在这里,您可以看到where函数工作正常。当我尝试使用子查询执行相同操作时,如下所示: 我得到这个错误: 属性错误回溯(最近一次调用)在---- /opt/cloudera/parcels/CDH-6.3.4-1。cdh6.3.4。p4744.

  • 找出两个表是否出现了对应的值, 打算使用exists关键字: 两个表: 第一张主表: 第二张子表: 想查看子表中中的内容是否出现在主表中??? 写完后就报错了,咨询下大佬们如何用查询主表中是否出现了子表的内容???? 我是这么写的:写完后运行报错(报错日志在最下边) 报错日志: