显示由其他值计算的一个结果的sql?

5w9g7ksd  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(297)

看来我们可以用 SQL 声明为:

select
  (
    select
      count(*) as c_foos
    from
      foos
  ),
  (
    select
      count(*) as c_bars
    from
      bars
  );

但我们做不到

select
  (
    select
      count(*) as c_foos
    from
      foos
  ),
  (
    select
      count(*) as c_bars
    from
      bars
  ),
  (
    select
      (c_foos / c_bars) as the_ratio
  );

select
  (
    select
      count(*) as c_foos
    from
      foos
  ),
  (
    select
      count(*) as c_bars
    from
      bars
  ),
  (c_foos / c_bars) as the_ratio;

有没有办法显示所有3个数字?什么能做什么不能做,有没有更明确的规定?

vwkv1x7d

vwkv1x7d1#

你可以试试这个:
你在一个空间里定义了两个CTE WITH 子句,因此可以在基于两个cte表的主查询中使用结果( cte_num 以及 cte_den )

WITH recursive
    cte_num AS (
    SELECT count(*) as c_foos
    FROM foos
),
cte_den AS (
    SELECT count(*) as c_bars
    FROM bars
)
SELECT
    cte_num.foos,
    cte_den.bars,
    cte_num.foos / cte_den.bars as the_ratio
from cte_num, cte_den;
cpjpxq1n

cpjpxq1n2#

有一些简单的规则。。。但是sql似乎太简单了,以至于大多数程序员更喜欢直截了当,后来又抱怨说他们没有明白其中的道理:)
您可以将查询看作流的描述:流中的列 select 共享输入(定义见 from ),但被评价“平行”,没有看到对方。你的复杂例子归结为一个事实,你不能这样做:

select 1 as a, 2 as b, a + b;

领域 a 以及 b 定义为查询的输出,但没有调用输入 a 以及 b . 您只需修改查询,使a和b成为输入:

select a + b from (select 1 as a, 2 as b) as inputs

这将起作用(顺便说一句,这是您查询的解决方案)。
附录:
混淆来自这样一个事实,在大多数SQL101情况下,输出是直接从输入创建的(数据只是通过)。
这个流模型很有用,因为它使事情在更复杂的情况下更容易推理。此外,我们避免含糊不清和循环。您可以在查询的上下文中考虑它,例如: select name as last_name, last_name as name, name || ' ' || last_name from person;

goucqfw6

goucqfw63#

将条件移至 FROM 条款:

select f.c_foos, b.c_bars, f.c_foos / f.c_bars
from (select count(*) as c_foos from foos
     ) f cross join
     (select count(*) as c_bars from bars
     ) b;

讽刺的是,您的第一个版本将在mysql中工作(参见这里)。我不认为这是故意的。我认为这是他们的解析器的产物——这意味着它碰巧可以工作,但在将来的版本中可能会停止工作。

qzlgjiam

qzlgjiam4#

最简单的方法是使用 CTE 返回两列:

with cte as (
  select
    (select count(*) from foos) as c_foos,
    (select count(*) from bars) as c_bars
)
select c_foos, c_bars, (c_foos / c_bars) as the_ratio
from cte

请注意,这两列的别名必须设置在每个查询的外部,而不是内部(括号)。

相关问题