Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

join con una vista no muestra los campos null

Estas en el tema de join con una vista no muestra los campos null en el foro de Mysql en Foros del Web. hola a todos , les comento mi problema, estoy tratanto de realizar un left join con una vista así: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original ...
  #1 (permalink)  
Antiguo 06/01/2015, 09:06
 
Fecha de Ingreso: junio-2010
Mensajes: 168
Antigüedad: 13 años, 10 meses
Puntos: 3
join con una vista no muestra los campos null

hola a todos , les comento mi problema, estoy tratanto de realizar un left join con una vista así:

Código SQL:
Ver original
  1. SELECT DISTINCT e.nit,f.total AS total,e.entidad
  2. FROM bdrcmr_entidades AS e
  3. LEFT JOIN vw_rojof AS f
  4. ON e.nit=f.nit
Aparentemente el join lo hace correctamente pero al momento de verificar la información me doy cuenta de que los campos que no estan en la vista deberian tener un NULL en el campo total, pero no es así. en su lugar a todos los campos les agrega un 1 (que es el valor que por defecto tiene esta columna en la vista rojo) .

espero hacerme entender, muchas gracias.

Última edición por gnzsoloyo; 06/01/2015 a las 09:18
  #2 (permalink)  
Antiguo 06/01/2015, 09:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: join con una vista no muestra los campos null

Código MySQL:
Ver original
  1. SELECT DISTINCT e.nit, f.total total, e.entidad
  2. FROM bdrcmr_entidades e LEFT JOIN vw_rojof f ON e.nit=f.nit
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 06/01/2015, 09:34
 
Fecha de Ingreso: junio-2010
Mensajes: 168
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: join con una vista no muestra los campos null

gnzsoloyo, muchas gracias por tu pronta respuesta, agregué la linea de codigo q me indicaste, pero el resultado es el mismo.

este el codigo de la vista rojo: (tal vez pueda ser de ayuda)

Código MySQL:
Ver original
  1. SELECT nit,1 as total
  2.  FROM entidades
  3.  where nit not in (select DISTINCT nit from tablax)
  4.             and nit not in (select DISTINCT nit from tablay)
  5. and nit!='' and nit!=0

gracias!
  #4 (permalink)  
Antiguo 06/01/2015, 09:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: join con una vista no muestra los campos null

Esta consulta:
Código SQL:
Ver original
  1. SELECT nit,1 AS total
  2.  FROM entidades
  3.  WHERE nit NOT IN (SELECT DISTINCT nit FROM tablax)
  4.             AND nit NOT IN (SELECT DISTINCT nit FROM tablay)
  5. AND nit!='' AND nit!=0
no aplica para LEFT JOIN ni recuperar nulos.

En este caso que ya vimos:
Código MySQL:
Ver original
  1. SELECT DISTINCT e.nit, f.total total, e.entidad
  2. FROM bdrcmr_entidades e LEFT JOIN vw_rojof f ON e.nit=f.nit

Devolverá NULL en la segunda columna si y sólo si existen registros en la primera tabla que no estén relacioandos con la segunda.
La pregunta es si realmente lo estás poniendo bien, porque no conozco los datos ni la estruc tura y estoy asumiendo que las tablas están en el orden correcto. Eso lo sabes tu, no yo.

Muestra los datos que tiene cada una, y cuáles erían los que según tu deberían devovler un NULL en esa segunda columna.

Por cierto: Tengamos claro que un NULL no es cer, ni un caracter vacío, ni tampoco algo diferente a cero, como muestra tu query.
Además, un NULL no es un dato, por lo que no puedes aplicar operadores como "=" o "!=".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 06/01/2015, 10:04
 
Fecha de Ingreso: junio-2010
Mensajes: 168
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: join con una vista no muestra los campos null

gonzalo, la vista fue probada asi:

Código MySQL:
Ver original
  1. select DISTINCT e.nit,f.total total,e.entidad
  2. from entidades e
  3. (SELECT nit,1 as total
  4.  FROM entidades
  5.  where nit not in (select DISTINCT nit from cotizaciones)
  6.             and nit not in (select DISTINCT nit from convenios)
  7. and nit!='' and nit!=0) as f
  8. on e.nit=f.nit

al momento de probarla, la vista previa muestra los resultados correctos y funciona bien (trae todos los null). pero al momento de guardarla me saca el error: views's slect contains a subquery in from clause

por tal motivo decidí crear esta subconsulta en una vista y el codigo para ello fue el anterior:
Código MySQL:
Ver original
  1. SELECT nit,1 as total
  2.  FROM entidades
  3.  where nit not in (select DISTINCT nit from cotizaciones)
  4.             and nit not in (select DISTINCT nit from convenios)
  5. and nit!='' and nit!=0
y la llame: vw_rojof

y finalmente para terminar (eso pensaba yo) hize el join entre la vista recien creada con el codigo restante:

Código MySQL:
Ver original
  1. select DISTINCT e.nit,f.total total,e.entidad
  2. from entidades e
  3. LEFT JOIN vw_rojof f
  4. on e.nit=f.nit
  5. WHERE true OR f.nit IS NULL #esta es la linea q tu me sugeriste

Pero al hacerlo de esta forma no me trae los campos null.

Espero haber sido claro sobre todo el proceso que he hecho. muchas gracias por tu ayuda
  #6 (permalink)  
Antiguo 06/01/2015, 10:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: join con una vista no muestra los campos null

Claro, si. Pero el que existan o no nulos depende de los DATOS, por lo que sin ver los datos que se cruzan, no pueda asegurarte que vayas a obtener ALGO.

No todas las cosas se resuelven en forma teórica.

Muestranos un set de datos de cada tabla, lo que obtienes con la consulta propuesta, y lo que dices que deberías obtener.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 06/01/2015, 10:52
 
Fecha de Ingreso: junio-2010
Mensajes: 168
Antigüedad: 13 años, 10 meses
Puntos: 3
Respuesta: join con una vista no muestra los campos null

hola, al ejecutar:
Código MySQL:
Ver original
  1. select DISTINCT e.nit,f.total total,e.entidad
  2. from entidades e
  3. LEFT JOIN vw_rojof f
  4. on e.nit=f.nit

da como resultado:
Código HTML:
Ver original
  1. 89090924xx  1   BELEN
  2. 8909814xx   1   CREAR
  3. 8909048xx   1   TELEP LTDA.
  4. 8600134xx   1   FONDO ASOCIACIÓN
  5. 8600148xx   1   FONDO IPSE
  6. 8002107xx   1   FONDO COL

y cuando ejecuto:
Código MySQL:
Ver original
  1. select DISTINCT e.nit,f.total total,e.entidad
  2. from entidades e
  3. (
  4. SELECT nit,1 as total
  5.  FROM entidades
  6.  where nit not in (select DISTINCT nit from cotizaciones)
  7.             and nit not in (select DISTINCT nit from convenios)
  8. and nit!='' and nit!=0) as f
  9. on e.nit=f.nit

da como resultado: (este es el q se debería obtener)

Código:
89090924xx		BELEN 
8909814xx		CREAR
8909048xx		TELEP LTDA.
8600134xx		FONDO ASOCIACIÓN
8600148xx	1	FONDO IPSE
8002107xx	1	FONDO COL
al ejecutar tanto la vista vw_rojo como la subconsulta mencionada (por separado) obtengo la misma cantidad de datos 1152
  #8 (permalink)  
Antiguo 06/01/2015, 17:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: join con una vista no muestra los campos null

Vamos a hacer una demostración evidente de que el problema no es la query, sino los datos que tienes, además de la sintaxis algo rebuscada que estás usando...

Supongamos que tenemos estas tablas (simulo con una tabla fija el resultado de la "vista" que tienes):
Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS vw_rojof;
  2. Query OK, 0 rows affected (0.16 sec)
  3.  
  4. mysql> DROP TABLE IF EXISTS entidad;
  5. Query OK, 0 rows affected (0.06 sec)
  6.  
  7. mysql> CREATE TABLE IF NOT EXISTS entidad (
  8.     ->     nit BIGINT UNSIGNED NOT NULL PRIMARY KEY,
  9.     ->     entidad VARCHAR(50)
  10.     -> );
  11. Query OK, 0 rows affected (0.03 sec)
  12.  
  13. mysql> CREATE TABLE vw_rojof (
  14.     ->     nit BIGINT UNSIGNED NOT NULL PRIMARY KEY,
  15.     ->     total INT UNSIGNED,
  16.     ->     FOREIGN KEY (nit)
  17.     ->         REFERENCES entidad (nit)
  18.     -> );
  19. Query OK, 0 rows affected (0.02 sec)

A estas tablas le agregaremos los registros de entidades:
Código MySQL:
Ver original
  1. mysql> INSERT INTO entidad
  2.     -> VALUES(8909092411, 'BELEN'),
  3.     -> (890981422, 'CREAR'),
  4.     -> (890904833, 'TELEP LTDA.'),
  5.     -> (860013444, 'FONDO ASOCIACIÓN'),
  6.     -> (860014855, 'FONDO IPSE'),
  7.     -> (800210766, 'FONDO COL');
  8. Query OK, 6 rows affected (0.00 sec)
  9. Records: 6  Duplicates: 0  Warnings: 0
Y luego sólo dos registros relacionados en la segunda tabla:
Código MySQL:
Ver original
  1. mysql> INSERT INTO vw_rojof
  2.     -> VALUES(860014855, 1), (800210766, 1);
  3. Query OK, 2 rows affected (0.00 sec)
  4. Records: 2  Duplicates: 0  Warnings: 0

Con eso ejecutaremos exactamente la misma consulta que yo te propuse:
Código MySQL:
Ver original
  1.     ->     e.nit, f.total total, e.entidad
  2.     -> FROM
  3.     ->     entidad e
  4.     ->         LEFT JOIN
  5.     ->     vw_rojof f ON e.nit = f.nit
  6.     -> WHERE
  7.     ->     TRUE OR f.nit IS NULL
  8.     -> ORDER BY e.entidad DESC;

La cual devuelve:
Código MySQL:
Ver original
  1. +------------+-------+------------------+
  2. | nit        | total | entidad          |
  3. +------------+-------+------------------+
  4. |  890904833 |  NULL | TELEP LTDA.      |
  5. |  860014855 |     1 | FONDO IPSE       |
  6. |  800210766 |     1 | FONDO COL        |
  7. |  860013444 |  NULL | FONDO ASOCIACIàN |
  8. |  890981422 |  NULL | CREAR            |
  9. | 8909092411 |  NULL | BELEN            |
  10. +------------+-------+------------------+
  11. 6 rows in set (0.00 sec)
Que es exactamente el resultado que buscas...

Como verás, esa consulta es la correcta. Si no la estás obteniendo es porque las que usas están mal redactadas, o bien los datos no cumplen con lo que dices.

Ahora bien, cuando te pido un set de datos , no me estoy refiriendo a las consultas que hiciste, sino a DATOS REALES QUE TIENE CADA UNA DE LAS TABLAS. El problema que te aqueja debe ser analizado en un contexto real, no teórico, porque es un problema REAL que sólo existe en ese modo...
En la teoría, mi consulta estaba bien, pero sin ver los DATOS REALES, no sé qué es lo que está procesando tu base.

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, campos, join, muestra, null, select, vista
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:52.