Что такое ошибка # 1221 в Mysql и является ли основной проблемой в этом SqlQuery? - PullRequest
1 голос
/ 17 сентября 2009

Я использую MYSQL5.1, хотя я пытался найти документацию для этого, но безуспешно, во-вторых, я хотел знать логическую ошибку в следующем запросе ..

SQL QUERY

ВЫБРАТЬ дату, месяц, сумму (факт_1), (2 / Sum (fact_2)), 2 ОТ (ВЫБРАТЬ время.дата, время.месяц, время.год, MAX (sales_fact.sell_out_value) как факт_1, 0 как факт_2 ОТ sales_fact, time_dim как время ГДЕ time.id = sales_fact.time_id AND time.date = "2008-01-01" GROUP BY time.date ЗАКАЗАТЬ ПО time.year UNION ВЫБЕРИТЕ time.date, time.month, time.year, 0 как fact_1, MAX (sales_target_fact.sell_out_target) как факт_2 ОТ sales_target_fact, time_dim как время ГДЕ time.id = sales_target_fact.time_id AND time.date = "2008-01-01" GROUP BY time.date ORDER BY time.year) как Combined_Table GROUP BY дата ЗАКАЗАТЬ год

ОШИБКА ЛИНИЯ

  • Неправильное использование UNION и ORDER BY
  • ERRORCODE # 1221

Ответы [ 2 ]

6 голосов
/ 17 сентября 2009

Ошибка указывает на то, что ваш ORDER BY является неоднозначным, вам нужно заключить в скобки ваши операторы SELECT, чтобы указать MySQL, как его применять.

Из MySQL Docs :

Чтобы использовать предложение ORDER BY или LIMIT для сортировать или ограничивать весь результат UNION, заключить в скобки индивидуальный SELECT заявления и разместить заказ 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

В качестве альтернативы, если вы хотите, чтобы 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
0 голосов
/ 17 сентября 2009

http://dev.mysql.com/doc/refman/5.1/en/

возможно ошибка в ", time_dim как время", но я не уверен - попробуйте вырезать детали, пока ошибка не исчезнет, ​​и вы найдете ошибку

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