代码之家  ›  专栏  ›  技术社区  ›  Georg Heiler

带大括号的SQL运算符优先级

  •  0
  • Georg Heiler  · 技术社区  · 8 年前

    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 scala数据帧API,所以我真的需要获得正确的操作符优先级。从 What is the execution sequence of Group By, Having and Where clause in SQL Server? 一般来说,这似乎是真的,但我没有找到任何关于 ()

    1 回复  |  直到 8 年前
        1
  •  1
  •   Lukasz Szozda    8 年前

    此查询看起来不正确(缺少 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