Sql 在distinct子句中使用静态值

Sql 在distinct子句中使用静态值,sql,distinct,Sql,Distinct,由于我是SQL新手,我无法理解以下语句之间的区别: SELECT DISTINCT x , 66 FROM Person vs SELECT s.x, 66 FROM (SELECT DISTINCT x FROM Person ) s 性能有什么不同吗。 任何帮助都将不胜感激。谢谢 没有逻辑差异,因为常量66不影响两行是否相等 我怀疑这也没有性能上的差异,因为优化器可能会选择这种模式并将第一种形式转换为第二种形式。查看您最喜欢的RDBMS中的执行计划以找出答案。不应该有任何(显著的/可检测

由于我是SQL新手,我无法理解以下语句之间的区别:

SELECT DISTINCT x , 66 FROM Person
vs

SELECT s.x, 66 FROM (SELECT DISTINCT x FROM Person ) s
性能有什么不同吗。
任何帮助都将不胜感激。谢谢

没有逻辑差异,因为常量
66
不影响两行是否相等

我怀疑这也没有性能上的差异,因为优化器可能会选择这种模式并将第一种形式转换为第二种形式。查看您最喜欢的RDBMS中的执行计划以找出答案。

不应该有任何(显著的/可检测的)差异,因为查询优化器可以看到它是相同的

通过查看查询的执行计划和/或查询的IO和时间统计信息,您可以自己看到这一点。 在我自己的测试中,它们都是一样的。 两者都会导致扫描和标量计算

如果我要选择,我会选择#1,因为它更容易阅读,并且避免了子选择


如果您开始在查询中,尤其是子查询中添加更多逻辑,则可能会出现差异。因此,始终测试更改。

这甚至会再次执行相同的操作,您看到模式了吗?您只需创建另一个查询,更深一层,以预生成结果集。您可以随时这样做,如果幸运的话,优化器将在一段时间内看穿它

SELECT s.x, 66 FROM (SELECT t.x as x FROM ( SELECT DINSTINCT x FROM Person ) t ) s
最后,始终尝试使用可读性最好、可维护性最好的解决方案,而不是在不需要子查询的地方引入子查询。在大多数情况下,引入多余的子查询以获得相同的结果是微不足道的,但除了故意惹恼您之后的任何开发人员之外,我不明白您为什么要这样做:)