导致此错误的相关子查询-如果没有联接两端的字段相等的条件,则无法使用LEFT OUTER JOIN

时间:2019-05-03 14:54:57

标签: sql google-bigquery

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

但是它可以在其他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)

报告比其他两个学生大的学生。

2 个答案:

答案 0 :(得分:3)

以下是用于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

另一种效果不佳,因此不推荐使用,但仍然可以选择使用CROSS JOIN模仿非等距的LEFT JOIN

#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

答案 1 :(得分:0)

您正在尝试做的可怕的事情,但是让我们考虑一下您拥有什么。对于每个“ OUT”记录,您都在重新查询每个分配以获取计数。我建议的是3级查询。最内层是获取所有不同的“年龄”值(基于跳跃整数)。然后获得小于LESS的计数,而不是创建预汇总结果。然后,您可以基于最外面的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

此查询基于“年龄”列基于整数(非十进制)。