Приоритет оператора SQL с фигурными скобками - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть SQL-запрос, который я не совсем понимаю относительно приоритета оператора:

SELECT
foo,
count(*)
FROM
A
JOIN (SELECT
  SUM(IF(bar = 2,1,0)) as bar_sum,
  SUM(IF(foo >= 1,1,0)) as foo,
  SUM(1) as sum_1
  FROM
  B
  ) as sums
GROUP BY
id,
bar_sum,
foo,
sum_1
ON A.id = B.id

действительно ли GROUP BY из внешней скобки действительно относится к внутренней?Обратите внимание, мне нужно перенести этот SQL из Hive в Spark API DataFrame Scala, поэтому мне действительно нужно правильно определить приоритет оператора.От Какова последовательность выполнения предложения Group By, Have и Where в SQL Server? В целом это выглядит так, но я не нашел никакой документации относительно ().

1 Ответ

0 голосов
/ 29 сентября 2018

Этот запрос выглядит некорректно (отсутствует условие ON)

SELECT foo,count(*)
FROM A
JOIN (SELECT SUM(IF(bar = 2,1,0)) as bar_sum,
             SUM(IF(foo >= 1,1,0)) as foo,
             SUM(1) as sum_1
      FROM   B) as sums  -- should be `ON`
GROUP BY id, bar_sum, foo, sum_1;
        -- looks like grouping by sum_1, bar_sum is superflous

GROUP BY применяется только к внешнему запросу.Обратите внимание, что внутренний запрос будет возвращать одну строку.

SELECT SUM(IF(bar = 2,1,0)) as bar_sum,
       SUM(IF(foo >= 1,1,0)) as foo,
       SUM(1) as sum_1
FROM   B
-- single row

Затем вы присоединяете одну строку к таблице A и получаете столько строк, сколько разных значений (id, foo).

...