看来我们可以用 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个数字?什么能做什么不能做,有没有更明确的规定?
4条答案
按热度按时间vwkv1x7d1#
你可以试试这个:
你在一个空间里定义了两个CTE
WITH
子句,因此可以在基于两个cte表的主查询中使用结果(cte_num
以及cte_den
)cpjpxq1n2#
有一些简单的规则。。。但是sql似乎太简单了,以至于大多数程序员更喜欢直截了当,后来又抱怨说他们没有明白其中的道理:)
您可以将查询看作流的描述:流中的列
select
共享输入(定义见from
),但被评价“平行”,没有看到对方。你的复杂例子归结为一个事实,你不能这样做:领域
a
以及b
定义为查询的输出,但没有调用输入a
以及b
. 您只需修改查询,使a和b成为输入:这将起作用(顺便说一句,这是您查询的解决方案)。
附录:
混淆来自这样一个事实,在大多数SQL101情况下,输出是直接从输入创建的(数据只是通过)。
这个流模型很有用,因为它使事情在更复杂的情况下更容易推理。此外,我们避免含糊不清和循环。您可以在查询的上下文中考虑它,例如:
select name as last_name, last_name as name, name || ' ' || last_name from person;
goucqfw63#
将条件移至
FROM
条款:讽刺的是,您的第一个版本将在mysql中工作(参见这里)。我不认为这是故意的。我认为这是他们的解析器的产物——这意味着它碰巧可以工作,但在将来的版本中可能会停止工作。
qzlgjiam4#
最简单的方法是使用
CTE
返回两列:请注意,这两列的别名必须设置在每个查询的外部,而不是内部(括号)。