我使用的应用程序使用 SQL Server 数据库,其中包括许多保存单行配置数据的表,在针对更传统的多行表的查询中有时需要这些表。我见过的大多数代码在处理单个查询时通过连接访问这些表,但在最近的一次代码审查中,我看到了一种使用标量子查询的方法,大致如下:
Select T.Id
From dbo.SomeTable T
Where T.SomeValue > (Select Tolerance From dbo.Settings)
虽然它显然有效,但我最初的反应是假设它违反了我们的标准做法,但我对表单进行了一些试验,发现“子查询返回超过 1 个值。当子查询如下时,这是不允许的=、!=、<、<=、>、>= 或当子查询用作表达式时”错误。这使得这似乎避免了意外 1:n 连接导致不良行为的风险。(在实践中,这些单行表不应该担心,它们相当健壮,但我已经看到它出现在系统的其他地方。)
除了(可能非常便宜)Stream Aggregate 和 Assert 之外,我的简单测试用例的执行计划看起来非常相似,我认为它们负责查询引擎在多行案例中识别和抛出错误的能力。
使用这种表格是否有普遍接受的最佳实践?在选择方法时,我应该注意哪些主要优点和缺点?
(我知道使用变量来保存数据也是一种选择,但在我们的某些代码中这样做并不总是可行的,所以我想专注于比较这两种方法和/或任何其他方式将其折叠成一个查询。)