【问题标题】:Combine two queries in PostgreSQL在 PostgreSQL 中合并两个查询
【发布时间】:2015-09-04 22:28:45
【问题描述】:

我需要两个查询的单个数组中的联合帮助:

在一个季度中与学生缺勤成绩相关的查询中:

$sSqlAsistencia =
         " SELECT
                ca.idcadete,                    
                coalesce(sum(i.cantidad),0) as cantidad

            FROM 
                cadetes ca,
                cursos c,
                cursos_cadetes cc
                left join inasistencias i on i.fk_idcurso = cc.fk_idcurso and i.fk_idcadete = cc.fk_idcadete
            WHERE 
                c.habilitado = true
                and ca.habilitado = true
                and c.fk_idanolectivo = ".$aAnoLectivoBuscar."
                and c.fk_idano = ".$aAnoBuscar."
                and c.fk_iddivision = ".$aDivisionBuscar."
                and cc.fk_idcurso = c.idcurso
                and cc.fk_idcadete = ca.idcadete
                and (EXTRACT(MONTH FROM i.fecha)  in ".$trimestre ." or i.cantidad is null)

            GROUP BY
                ca.idcadete

            ";
    $sSqlInasistencia = $oDB->Query($sSqlAsistencia);

idcadete | cantidad

203      |    4
305      |    0
120      |    10 

然后我有一段代码,因此我获得了满足其他查询的学生/学员奖:

$sSql = " SELECT idcadete, nombre, apellido, matricula
         FROM cadetes
        WHERE idcadete in
        (" . $sSqlPromedioEnCadaMateria . " INTERSECT " . $sSqlPromedioConducta;
        if (strlen($aPromedioGeneralEdFisicaMayorABuscar)) {
          $sSql .= " INTERSECT " . $sSqlPromedioEnEdFisica;
        }


$sSql .=    ")";
    $rsCadetesConPremio=$oDB->query($sSql);

idcadete | nombre | apellido | matricula
203      | adrian | perez    | 212121

尝试使用 INNER JOIN 链接这两个咨询,但我错了,因为它应该设法将两个查询结合起来,如下所示:

$premio = " SELECT a.idcadete, a.nombre, a.apellido, a.matricula, b.cantidad
        FROM ".$rsCadetesConPremio."a inner join ".$sSqlInasistencia."b on a.idcadete = b.idcadete
        ORDER BY a.idcadete";

----错误------

我需要以下结果:$premio

idcadete | nombre | apellido | matricula| cantidad
203      | adrian | perez    | 212121   |     4

【问题讨论】:

  • 它使用不同的语言
  • 队列 ----ERROR------- ?..
  • 谢谢,根据另一个论坛的建议,将两个查询合二为一。代码如下......

标签: sql arrays postgresql


【解决方案1】:

是的,您应该能够通过将任意两个查询的结果包装为派生表来连接任意两个查询。但是,您需要将两个派生表都括在括号中:FROM ( ...) a INNER JOIN ( ...) b

即:

"SELECT a.idcadete, a.nombre, a.apellido, a.matricula, b.cantidad
        FROM (".$rsCadetesConPremio.") a inner join (".$sSqlInasistencia.") b on a.idcadete = b.idcadete
        ORDER BY a.idcadete"

这是simplified Fiddle

【讨论】:

  • 谢谢,根据另一个论坛的建议,将两个查询合二为一。
【解决方案2】:

$sSqlAsistencia =
" SELECT
ca.idcadete,
ca.nombre, ca.apellido, ca.matricula
coalesce(sum(i.cantidad),0) as cantidad
FROM
cadetes ca,
cursos c,
cursos_cadetes cc
left join inasistencias i on i.fk_idcurso = cc.fk_idcurso and i.fk_idcadete = cc.fk_idcadete
WHERE
c.habilitado = true
and ca.habilitado = true
and c.fk_idanolectivo = ".$aAnoLectivoBuscar."
and c.fk_idano = ".$aAnoBuscar."
and c.fk_iddivision = ".$aDivisionBuscar."
and cc.fk_idcurso = c.idcurso
and cc.fk_idcadete = ca.idcadete
and (EXTRACT(MONTH FROM i.fecha) in ".$trimestre ." or i.cantidad is null)
and ca.idcadete in (" . $sSqlPromedioEnCadaMateria . " INTERSECT " . $sSqlPromedioConducta;
 
if (strlen($aPromedioGeneralEdFisicaMayorABuscar)) {
$sSqlAsistencia .= " INTERSECT " . $sSqlPromedioEnEdFisica;
}
 
$sSqlAsistencia .= ")
GROUP BY
ca.idcadete
";

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多