什么是Mysql中的错误#1221并且是此SqlQuery中的基本问题?

Ash*_*wal 1 mysql sql

我正在使用MYSQL5.1,虽然我试图找到这方面的文档但是没有成功,其次我想知道以下查询中的逻辑错误..

SQL QUERY

SELECT日期,月份,Sum(fact_1),(2/Sum(fact_2)),2 FROM(SELECT time.date,time.month,time.year,MAX(sales_fact.sell_out_value)as fact_1,0作为fact_2 FROM sales_fact, time_dim as time WHERE time.id = sales_fact.time_id AND time.date ="2008-01-01"GROUP BY time.date ORDER BY time.year UNION SELECT time.date,time.month,time.year,0 as fact_1 ,MAX(sales_target_fact.sell_out_target)as fact_2 FROM sales_target_fact,time_dim as time WHERE time.id = sales_target_fact.time_id AND time.date ="2008-01-01"GROUP BY time.date ORDER BY time.year)as Combined_Table GROUP BY日期按年份排序

错误行

  • UNION和ORDER BY的使用不正确
  • 错误代码#1221

Ada*_*ire 6

该错误表明您ORDER BY的模糊不清,您需要将SELECT语句括起来向MySQL表明它是如何应用的.

来自MySQL Docs:

要使用ORDER BY或LIMIT子句对整个UNION结果进行排序或限制,请为各个SELECT语句加上括号,并将ORDER BY或LIMIT放在最后一个之后.

因此,根据您的查询,将每个查询放在括号内并将其放在ORDER BY外面:

SELECT date , month , Sum(fact_1) , ( 2 / Sum(fact_2) ) , 2 
FROM( 
  (SELECT time.date, time.month, time.year, 
     MAX(sales_fact.sell_out_value) as fact_1, 0 as fact_2 
  FROM sales_fact, time_dim as time 
  WHERE time.id=sales_fact.time_id AND time.date="2008-01-01"
  GROUP BY time.date)
  UNION 
  (SELECT time.date, time.month, time.year, 0 as fact_1,
     MAX(sales_target_fact.sell_out_target) as fact_2
   FROM sales_target_fact, time_dim as time
   WHERE time.id=sales_target_fact.time_id AND time.date="2008-01-01"
   GROUP BY time.date)
   ORDER BY time.year
) as Combined_Table GROUP BY date ORDER BY year
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望在ORDER BY每个语句之前单独应用UNION,请将ORDER BY两个SELECT语句中的每个语句放在括号内.

SELECT date , month , Sum(fact_1) , ( 2 / Sum(fact_2) ) , 2 
FROM( 
  (SELECT time.date, time.month, time.year, 
     MAX(sales_fact.sell_out_value) as fact_1, 0 as fact_2 
  FROM sales_fact, time_dim as time 
  WHERE time.id=sales_fact.time_id AND time.date="2008-01-01"
  GROUP BY time.date
  ORDER BY time.year)
  UNION 
  (SELECT time.date, time.month, time.year, 0 as fact_1,
     MAX(sales_target_fact.sell_out_target) as fact_2
   FROM sales_target_fact, time_dim as time
   WHERE time.id=sales_target_fact.time_id AND time.date="2008-01-01"
   GROUP BY time.date
   ORDER BY time.year)
) as Combined_Table GROUP BY date ORDER BY year
Run Code Online (Sandbox Code Playgroud)