我有一个可能是愚蠢的问题。 查看查询:
select count(a) as A, count(b) as b, count(a)+count(b) as C
From X
如何在不重复代码的情况下总结两列: 类似的东西:
select count(a) as A, count(b) as b, A+B as C
From X
答案 0 :(得分:3)
为了完整起见,请使用CTE:
WITH V AS (
SELECT COUNT(a) as A, COUNT(b) as B
FROM X
)
SELECT A, B, A + B as C
FROM V
答案 1 :(得分:2)
这可以通过使引擎仅执行两个聚合函数和标量计算来轻松处理。试试这个。
SELECT A, B, A + B as C
FROM (
SELECT COUNT(a) as A, COUNT(b) as B
FROM X
) T
答案 2 :(得分:0)
您可以获得同一个表的两个单独的计数,然后得到这些计数的总和,如下图
SELECT
(SELECT COUNT(a) FROM X )+
(SELECT COUNT(b) FROM X )
AS C
答案 3 :(得分:0)
让我们就一点达成一致:SQL不是面向对象的语言。事实上,当我们考虑计算机语言时,我们正在考虑过程语言(您使用该语言逐步描述您希望如何操作数据)。 SQL是声明性的(您描述了所需的结果,系统会找出如何获得它)。
当您使用过程语言编程时,您的主要关注点是:1)这是获得正确结果的最佳算法吗? 2)这些步骤是否正确实现了算法?
当您使用声明性语言编程时,主要关注的是:这是对所需结果的最佳描述吗?
在SQL中,您的大部分工作都将正确地形成过滤条件(where
子句)和连接条件(任何on
子句)。一旦正确完成,您几乎只需要汇总和格式化(如果适用)。
您展示的第一个查询是完美形成的。您需要A中所有非空值的数量,B中所有非空值的数量以及这两个值的总和。在某些系统中,您甚至可以使用您显示的第二种形式,这只会抽象出count(x)
文本。这很方便,如果您需要将count(x)
更改为sum(x)
,则只需在一个地方而不是两个地方进行更改,但它不会更改数据 - 这很重要。
使用CTE或嵌套查询可能允许您模拟某些系统中不可用的抽象,但要小心进行外观修改 - 不会改变数据描述的更改。如果你在显示它们时查看两个查询的执行计划,CTE和子查询,在大多数系统中它们可能都是相同的。换句话说,你已经为你的车涂上了不同的颜色,但它仍然是同一辆车。
但是,由于它现在需要在4行或5行中进行两个不同的步骤来解释它最初只用一行表达的一步,所以很难捍卫你已经改进的观念。事实上,我打赌你可以提出更多的要点来解释为什么如果你开始使用CTE或子查询会更好,并且应该将它们更改为原始查询而不是相反。
我并不是说你正在做的是错误。但在现实世界中,我们通常没有多余的时间花在严格的化妆品变化上。