Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 导致此错误的相关子查询-如果没有连接两侧字段相等的条件,则无法使用左外部连接_Sql_Google Bigquery - Fatal编程技术网

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

使用WHERE子句在BigQuery中编写相关子查询时,会导致错误。 如果没有连接两侧字段相等的条件,则不能使用左外连接

不管它在其他SQL引擎中如何工作,我不理解错误或如何重写查询

导致相同错误的相同类型的不同查询

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.aget1.age。但这并不能解释您的错误。年龄字段是整数还是十进制?我建议您查看常规重写SELECT*FROM SELECT。。。,按年龄排列的行数按别名排列,其中alias.ROW\u NUMBER>=2被认为应该给出与您的相关子查询相同的结果,因为您在相关子查询中模拟或模拟排名或行号。为您的问题仔细选择标记非常重要,以避免大量不相关的注释和答案!!!下一次,如果您的问题非常特定于BigQuery,我建议您只使用BigQuery标记,而不包括sql标记。显然,问题是您自己的,这取决于您:当使用WHERE子句在BigQuery中编写相关子查询时,它会导致错误。。。为什么要在查询工作中选择UniqAge.Age,从august-monolith-205810.Assignment.students中选择COUNT*,其中Age