如何修复"子查询返回超过1行"错误?

时间:2018-03-22 00:48:22

标签: mysql sql

我在MySQL中获得子查询返回多行错误。

SELECT  variable.libelle_variable,
    donnee.statistique,
    (SELECT SUM(do.statistique) 
     FROM `donnee` as do , `quartier`, `type_donnee`, `variable`, `donnee`, `associer` 
     WHERE
          (type_donnee.libelle_type_donnee = "Activités commerciales" 
       AND associer.code_quartier = quartier.code_quartier 
       AND associer.id_donnee = donnee.id_donnee 
       AND associer.id_variable = variable.id_variable 
       AND associer.id_type_donnee = type_donnee.id_type_donnee 
       AND do.id_donnee = associer.id_donnee 
          ) 
     GROUP BY variable.libelle_variable 
    )
FROM 
    `quartier`, 
    `type_donnee`,
    `variable`,
    `donnee`,
    `associer`
 WHERE 
    type_donnee.libelle_type_donnee = "Activités commerciales"
 AND
    quartier.nom_quartier = "Hôpitaux-facultés"
 AND 
    associer.code_quartier = quartier.code_quartier 
 AND 
    associer.id_donnee = donnee.id_donnee 
 AND 
    associer.id_variable = variable.id_variable 
 AND 
    associer.id_type_donnee = type_donnee.id_type_donnee 
 GROUP BY  
    variable.libelle_variable

问题是当我单独测试时,我的子查询只返回一行。

1 个答案:

答案 0 :(得分:1)

问题出在select子查询中。

根据您的问题,您不需要在select

上使用子查询

避免使用CROSS JOIN

您可以使用inner join代替CROSS JOIN

SELECT  variable.libelle_variable,
        donnee.statistique,
        SUM(do.statistique)
    FROM 
        `associer`
        INNER JOIN  `quartier` ON associer.code_quartier = quartier.code_quartier 
        INNER JOIN `type_donnee` ON associer.id_type_donnee = type_donnee.id_type_donnee 
        INNER JOIN `variable` ON associer.id_variable = variable.id_variable 
        INNER JOIN `donnee` ON associer.id_donnee = donnee.id_donnee 
     WHERE 
        type_donnee.libelle_type_donnee = "Activités commerciales"
     AND
        quartier.nom_quartier = "Hôpitaux-facultés"
     GROUP BY  variable.libelle_variable,donnee.statistique

修改

你可以试试这个。

SELECT  
    variable.libelle_variable,
    donnee.statistique,
    (
     SELECT SUM(do.statistique) 
     FROM `donnee` as do , 
          `quartier`, 
          `type_donnee`, 
          `variable` AS T1, 
          `donnee`, 
          `associer` 
     WHERE
          (
              type_donnee.libelle_type_donnee = "Activités commerciales" 
           AND associer.code_quartier = quartier.code_quartier 
           AND associer.id_donnee = donnee.id_donnee 
           AND associer.id_variable = T1.id_variable 
           AND associer.id_type_donnee = type_donnee.id_type_donnee 
           AND do.id_donnee = associer.id_donnee 
           AND T1.libelle_variable = variable.libelle_variable
          ) 
    )
FROM 
    `associer`
    INNER JOIN  `quartier` ON associer.code_quartier = quartier.code_quartier 
    INNER JOIN `type_donnee` ON associer.id_type_donnee = type_donnee.id_type_donnee 
    INNER JOIN `variable` ON associer.id_variable = variable.id_variable 
    INNER JOIN `donnee` ON associer.id_donnee = donnee.id_donnee 
 WHERE 
    type_donnee.libelle_type_donnee = "Activités commerciales"
 AND
    quartier.nom_quartier = "Hôpitaux-facultés"
 GROUP BY  
     variable.libelle_variable,
     donnee.statistique