Коррелированный подзапрос, вызывающий эту ошибку - LEFT OUTER JOIN не может быть использован без условия, которое является равенством полей с обеих сторон соединения - PullRequest
3 голосов
/ 03 мая 2019

При написании коррелированных подзапросов в BigQuery с использованием предложения WHERE это приводит к ошибке.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 ]

3 голосов
/ 03 мая 2019

Ниже для стандартного SQL BigQuery

#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
0 голосов
/ 03 мая 2019

Ужасная вещь, которую вы пытаетесь сделать, но давайте подумаем о том, что у вас есть. Для каждой записи «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

Этот запрос основан на столбце Age, основанном на INTEGER (не десятичном).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...