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