mysql从视图中选择where条件给出的结果与使用where condition执行视图定义的结果不同

时间:2014-06-15 19:50:32

标签: mysql database view

我有一个具有以下定义的视图:

    select 
        `cb_trans_detail`.`numero_partida` AS `numero_partida`,
        `cb_trans_head`.`fecha_partida` AS `fecha_partida`,
        `cb_trans_detail`.`concepto_partida` AS `concepto_partida`,
        `cb_cuenta`.`nombre_cuenta` AS `nombre_cuenta`,
        `cb_cuenta`.`codigo_mayor` AS `codigo_mayor`,
        `cb_mayor`.`nombre_mayor` AS `nombre_mayor`,
        `cb_mayor`.`categoria` AS `categoria`,
        `cb_categoria`.`nombre` AS `nombre`,
        `cb_categoria`.`presentacion` AS `presentacion`,
        `cb_trans_detail`.`codigo_cuenta` AS `codigo_cuenta`,
        sum(`cb_trans_detail`.`debito_partida`) AS `Debitos`,
        sum(`cb_trans_detail`.`credito_partida`) AS `Creditos`,
        `cb_cuenta`.`saldo_inicial` AS `saldo_inicial`,
        ((`cb_cuenta`.`saldo_inicial` + 
       sum(`cb_trans_detail`.`debito_partida`)) - 
       sum(`cb_trans_detail`.`credito_partida`)) AS `Saldo`,
        concat(`cb_mayor`.`categoria`,`cb_cuenta`.`codigo_mayor`,`cb_trans_detail`.`codigo_cuenta`)
 AS `Codigo` 
      from 
        ((((`cb_trans_detail` join `cb_cuenta`
      on(((`cb_trans_detail`.`codigo_cuenta` = `cb_cuenta`.`codigo_cuenta`) 
      and (`cb_trans_detail`.`categoria` = `cb_cuenta`.`categoria`) 
     and (`cb_trans_detail`.`codigo_mayor` = `cb_cuenta`.`codigo_mayor`)))) 
     join `cb_mayor` on(((`cb_cuenta`.`codigo_mayor` = `cb_mayor`.`codigo_mayor`) 
     and (`cb_cuenta`.`categoria` = `cb_mayor`.`categoria`)))) 
     join `cb_categoria` on(((`cb_mayor`.`categoria` = `cb_categoria`.`categoria`) 
     and (`cb_trans_detail`.`categoria` = `cb_categoria`.`categoria`)))) 
     left join `cb_trans_head` on((`cb_trans_detail`.`numero_partida` = 
     `cb_trans_head`.`numero_partida`))) 
      where 
        (`cb_categoria`.`presentacion` = '1')
        group by  concat(`cb_mayor`.`categoria`,`cb_cuenta`.`codigo_mayor`,
        `cb_trans_detail`.`codigo_cuenta`)

如果我从这个视图中选择如下:

SELECT 
  `balance_general_view`.`numero_partida`,
  `balance_general_view`.`fecha_partida`,
  `balance_general_view`.`concepto_partida`,
  `balance_general_view`.`nombre_cuenta`,
  `balance_general_view`.`codigo_mayor`,
  `balance_general_view`.`nombre_mayor`,
  `balance_general_view`.`categoria`,
  `balance_general_view`.`nombre`,
  `balance_general_view`.`presentacion`,
  `balance_general_view`.`codigo_cuenta`,
  `balance_general_view`.`Debitos`,
  `balance_general_view`.`Creditos`,
  `balance_general_view`.`saldo_inicial`,
  `balance_general_view`.`Saldo`,
  `balance_general_view`.`Codigo`
FROM
  `balance_general_view`
WHERE
  `balance_general_view`.`fecha_partida` BETWEEN '2014-01-01' AND '2014-01-31'

这会产生与我执行查询时不同的结果:

select 
    `cb_trans_detail`.`numero_partida` AS `numero_partida`,
    `cb_trans_head`.`fecha_partida` AS `fecha_partida`,
    `cb_trans_detail`.`concepto_partida` AS `concepto_partida`,
    `cb_cuenta`.`nombre_cuenta` AS `nombre_cuenta`,
    `cb_cuenta`.`codigo_mayor` AS `codigo_mayor`,
    `cb_mayor`.`nombre_mayor` AS `nombre_mayor`,
    `cb_mayor`.`categoria` AS `categoria`,
    `cb_categoria`.`nombre` AS `nombre`,
    `cb_categoria`.`presentacion` AS `presentacion`,
    `cb_trans_detail`.`codigo_cuenta` AS `codigo_cuenta`,
    sum(`cb_trans_detail`.`debito_partida`) AS `Debitos`,
    sum(`cb_trans_detail`.`credito_partida`) AS `Creditos`,
    `cb_cuenta`.`saldo_inicial` AS `saldo_inicial`,
    ((`cb_cuenta`.`saldo_inicial` + sum(`cb_trans_detail`.`debito_partida`)) - sum(`cb_trans_detail`.`credito_partida`)) AS `Saldo`,
    concat(`cb_mayor`.`categoria`,`cb_cuenta`.`codigo_mayor`,`cb_trans_detail`.`codigo_cuenta`) AS `Codigo` 
  from 
    ((((`cb_trans_detail` join `cb_cuenta` on(((`cb_trans_detail`.`codigo_cuenta` = `cb_cuenta`.`codigo_cuenta`) and (`cb_trans_detail`.`categoria` = `cb_cuenta`.`categoria`) and (`cb_trans_detail`.`codigo_mayor` = `cb_cuenta`.`codigo_mayor`)))) join `cb_mayor` on(((`cb_cuenta`.`codigo_mayor` = `cb_mayor`.`codigo_mayor`) and (`cb_cuenta`.`categoria` = `cb_mayor`.`categoria`)))) join `cb_categoria` on(((`cb_mayor`.`categoria` = `cb_categoria`.`categoria`) and (`cb_trans_detail`.`categoria` = `cb_categoria`.`categoria`)))) left join `cb_trans_head` on((`cb_trans_detail`.`numero_partida` = `cb_trans_head`.`numero_partida`))) 
  where 
    (`cb_categoria`.`presentacion` = '1') and `cb_trans_head`.`fecha_partida` BETWEEN '2014-01-01' and '2014-01-31'
  group by 
    concat(`cb_mayor`.`categoria`,`cb_cuenta`.`codigo_mayor`,`cb_trans_detail`.`codigo_cuenta`)

我的问题是:如何使用视图和过滤以编程方式获取我需要的结果而不是硬编码where条件?谢谢。如果您需要单独的表定义,请告诉我。非常感谢。

1 个答案:

答案 0 :(得分:0)

如果对表X使用左连接和对此表X使用WHERE - 子句中的条件,则将左连接更改为内连接。如果要按左连接表的值限制结果,则必须在左连接的ON子句中使用此条件:

...
LEFT JOIN 
    cb_trans_head 
ON
    cb_trans_detail.numero_partida = cb_trans_head.numero_partida
AND
    cb_trans_head.fecha_partida BETWEEN '2014-01-01' and '2014-01-31'
...

如果还有另一个我忽略的,那就按照同样的方式行事。