联合查询中定义别名的错误

时间:2013-09-19 16:24:07

标签: mysql

我从三个不同的表中提取相同的信息:我需要在一个表中获取所有数据,将结果分组为每个单个查询。我写的查询如下:

SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(totali) FROM 
SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali FROM fatture, fa_ce_ca,centri_costoricavo, movimenti WHERE fatture.esercizio=3 AND fatture.id_fa=fa_ce_ca.id_fa AND centri_costoricavo.id=fa_ce_ca.centro AND movimenti.id=fa_ce_ca.caus GROUP BY fa_ce_ca.caus AS fatture 
UNION SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali FROM mov_banca,centri_costoricavo, movimenti,esercizi WHERE centri_costoricavo.id=mov_banca.centro AND movimenti.id=mov_banca.tipo AND mov_banca.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_banca.per=2 GROUP BY mov_banca.tipo AS mov_banca 
UNION SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali FROM mov_cassa,centri_costoricavo, movimenti,esercizi WHERE centri_costoricavo.id=mov_cassa.centro AND movimenti.id=mov_cassa.tipo AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_cassa.per=2 GROUP BY mov_cassa.tipo) AS mov_cassa 
GROUP BY movimenti.movimento

尝试执行查询我收到以下错误:“...在'AS mov_banca UNION(S ......)附近使用正确的语法。几个小时后我的头靠在墙上我看不清楚我是什么我做错了。有什么帮助吗?

提前致谢! Lelio

2 个答案:

答案 0 :(得分:0)

删除每个联合中SELECT查询周围的括号。正确的语法是:

SELECT <column-list>
FROM {<table>|<derived-table>} [[AS] <alias>]
[UNION [ALL]
 SELECT <column-list>
 FROM {<table>|<derived-table>} [[AS] <alias>]
]*

请注意,您仍然需要围绕 derived-table子查询的括号,而不是联合的部分。

此外,在尝试格式化查询时,看起来你的括号和子查询都有趣。我相信你想要工会的总和,也很可能想要一个UNION ALL而不是一个UNION。您还需要从整个派生表子查询中进行选择(我在下面的示例中已将其命名为X

因此,您的查询应该(可能)为:

SELECT X.descrizione, X.movimento, sum(totali) 
FROM (
    SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali 
    FROM fatture, fa_ce_ca,centri_costoricavo, movimenti 
    WHERE fatture.esercizio=3 
    AND fatture.id_fa=fa_ce_ca.id_fa 
    AND centri_costoricavo.id=fa_ce_ca.centro 
    AND movimenti.id=fa_ce_ca.caus 
    GROUP BY fa_ce_ca.caus
    UNION ALL
    SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali 
    FROM mov_banca,centri_costoricavo, movimenti,esercizi 
    WHERE centri_costoricavo.id=mov_banca.centro 
    AND movimenti.id=mov_banca.tipo 
    AND mov_banca.data BETWEEN esercizi.start AND esercizi.end 
    AND esercizi.id=3 
    AND mov_banca.per=2 
    GROUP BY mov_banca.tipo
    UNION ALL
    SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali 
    FROM mov_cassa,centri_costoricavo, movimenti,esercizi 
    WHERE centri_costoricavo.id=mov_cassa.centro 
    AND movimenti.id=mov_cassa.tipo 
    AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end 
    AND esercizi.id=3 
    AND mov_cassa.per=2 
    GROUP BY mov_cassa.tipo
) AS X
GROUP BY X.movimento

虽然仍然 非常奇怪(读取:仅限MySQL,hackish,很难理解,坦率地说无法预测)GROUP BY和您选择使用“旧”JOIN语法使您的查询更难阅读。

答案 1 :(得分:0)

我接受了您的查询并将其格式化为

SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(totali) 
FROM ( (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali 
        FROM fatture, fa_ce_ca,centri_costoricavo, movimenti 
        WHERE fatture.esercizio=3 AND fatture.id_fa=fa_ce_ca.id_fa AND centri_costoricavo.id=fa_ce_ca.centro AND movimenti.id=fa_ce_ca.caus 
        GROUP BY fa_ce_ca.caus
       ) AS fatture 
       UNION 
       (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali 
        FROM mov_banca,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_banca.centro AND movimenti.id=mov_banca.tipo AND mov_banca.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_banca.per=2 
        GROUP BY mov_banca.tipo
       ) AS mov_banca 
       UNION
      (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali 
        FROM mov_cassa,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_cassa.centro AND movimenti.id=mov_cassa.tipo AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_cassa.per=2 
       GROUP BY mov_cassa.tipo) AS mov_cassa
      ) 
GROUP BY movimenti.movimento

看来你错过了一个括号......

SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(totali) 
--
-- 2 opening parenthesis.
--
FROM ( (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(fa_ce_ca.importo) AS totali 
        FROM fatture, fa_ce_ca,centri_costoricavo, movimenti 
        WHERE fatture.esercizio=3 AND fatture.id_fa=fa_ce_ca.id_fa AND centri_costoricavo.id=fa_ce_ca.centro AND movimenti.id=fa_ce_ca.caus 
        GROUP BY fa_ce_ca.caus
       ) AS fatture 
       UNION 
       (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_banca.importo) AS totali 
        FROM mov_banca,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_banca.centro AND movimenti.id=mov_banca.tipo AND mov_banca.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_banca.per=2 
        GROUP BY mov_banca.tipo
       ) AS mov_banca 
       UNION
      (SELECT centri_costoricavo.descrizione, movimenti.movimento, sum(mov_cassa.importo) AS totali 
        FROM mov_cassa,centri_costoricavo, movimenti,esercizi 
        WHERE centri_costoricavo.id=mov_cassa.centro AND movimenti.id=mov_cassa.tipo AND mov_cassa.data BETWEEN esercizi.start AND esercizi.end AND esercizi.id=3 AND mov_cassa.per=2 
       GROUP BY mov_cassa.tipo) AS mov_cassa
      ) 
   ) temp   --   <----------------  Is it missing ?
GROUP BY temp.movimento