Sql 导致此错误的相关子查询-如果没有连接两侧字段相等的条件,则无法使用左外部连接
使用WHERE子句在BigQuery中编写相关子查询时,会导致错误。 如果没有连接两侧字段相等的条件,则不能使用左外连接 不管它在其他SQL引擎中如何工作,我不理解错误或如何重写查询 导致相同错误的相同类型的不同查询Sql 导致此错误的相关子查询-如果没有连接两侧字段相等的条件,则无法使用左外部连接,sql,google-bigquery,Sql,Google Bigquery,使用WHERE子句在BigQuery中编写相关子查询时,会导致错误。 如果没有连接两侧字段相等的条件,则不能使用左外连接 不管它在其他SQL引擎中如何工作,我不理解错误或如何重写查询 导致相同错误的相同类型的不同查询 SELECT out.* FROM `august-monolith-205810.Assignment.students` AS out WHERE 2 >= ( SELECT COUNT(*) FROM `august-monolith
SELECT
out.*
FROM
`august-monolith-205810.Assignment.students` AS out
WHERE
2 >= (
SELECT
COUNT(*)
FROM
`august-monolith-205810.Assignment.students` AS t1
WHERE
out.age < t1.age)
报告年龄最多比其他两名学生大的学生。你们想做的事情很可怕,但让我们想想你们有什么。对于每个OUT记录,您将再次查询每个作业以获得计数。我建议的是一个三级查询。最内部的方法是基于整数获取所有不同的年龄值。然后获取小于的计数以创建预聚合结果。然后,您可以根据最外层的out值与重复查询连接到原始out。差不多
select
out
from
`august-monolith-205810.Assignment.students` AS out
JOIN ( select
UniqAge.Age,
( SELECT COUNT(*)
FROM `august-monolith-205810.Assignment.students`
WHERE age < UniqAge.age) CountUnderAge
from
( select distinct age
from `august-monolith-205810.Assignment.students` ) UniqAge
) PQByAge
on out.age = PQByAge
AND PQByAge.CountUnderAge <= 2
此查询基于年龄列是基于整数的非十进制。下面是针对BigQuery标准SQL的
#standardSQL
SELECT * EXCEPT(cnt)
FROM (
SELECT *, COUNT(1) OVER(ORDER BY age RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) cnt
FROM `august-monolith-205810.Assignment.students`
)
WHERE cnt BETWEEN 1 AND 2
另一种效果较差,因此不推荐使用,但仍然可以选择使用交叉连接来模拟非相等左连接
#standardSQL
SELECT ANY_VALUE(out).*
FROM `august-monolith-205810.Assignment.students` AS out
CROSS JOIN `august-monolith-205810.Assignment.students` AS t1
WHERE out.age > t1.age
GROUP BY out.id
HAVING COUNT(t1.age) <= 2
不知道bigquery,所以不确定它是否偏离了标准SQL。从逻辑上讲,我认为如果你想让学生年龄超过最多2岁,你需要将out.age