[Python-es] SqlAlchemy, no consigo hacer un join

Ricardo Cárdenes ricardo.cardenes en gmail.com
Sab Mar 5 06:28:03 EST 2016


Un JOIN normal hace exactamente eso: un cruce entre las dos tablas
mostrando las filas donde hay coincidencias. Es lo que se llama "inner
join" (una combinación interna). Lo que tú quieres es que se muestren todas
las filas de una de las tablas que participan en la combinación y que, de
la otra, aparezcan los datos que coinciden. Esto se denomina "outer join"
(combinación externa). Las combinaciones externas las tienes de dos tipos,
por la izquierda y por la derecha, dependiendo de qué tabla tenga que salir
entera. Es decir:

  .... FROM articulos LEFT OUTER JOIN movimientos ...

Obtendrá una nueva tabla donde aparecerán todas las filas de "artículos"
(la tabla "por la izquierda") y también las filas de movimientos que
correspondan. Para las filas de artículos sin movimientos, esas columnas
aparecerán (normalmente) como valores nulos, no como 0. Eso te debería dará
valores incorrectos para el sumatorio, porque NULL + valor numérico debería
ser NULL. Una solución es usar, por ejemplo, la función COALESCE (es del
estándar SQL y SQLite la soporta). Se usaría así:

  func.sum(func.coalesce(movimientos.uEntrada, 0))

si no recuerdo mal. Lo que hace COALESCE es tomar una serie de valores y
devolver el primero que no sea NULL. De esa manera, si movimientos.uEntrada
es NULL, devolverá 0.

Saludos,
Ricardo

2016-03-04 23:25 GMT-10:00 kausdiv <kausdiv en gmail.com>:

> ¡ Perfecto !
>
> Es eso. Pero tengo otro problema:
>
> Supón que tengo 5 artículos dados de alta, y solo 2 tienen movimientos.
>
> La consulta actual solo muestra los 2 que tienen movimientos.
>
> ¿ Como podría hacer que aparezcan los 5, y los que no tienen movimientos
> que salgan a 0 las entras y salidas ?
>
> Saludos.
>
> El 05/03/2016 a las 6:46, Ricardo Cárdenes escribió:
>
>
> session.query(articulos.id,  articulos.nombre,
> func.sum(movimientos.uEntrada).label('Entradas'),
> func.sum(movimientos.uSalida).label('Salidas')).join(movimientos,
> articulos).all()
>
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20160305/fc610341/attachment.html>


Más información sobre la lista de distribución Python-es