none
CONSULTA CON REGISTROS INEXISTENTES RRS feed

  • Pregunta

  • Buen día tengo la siguiente consulta.

    SELECT Tb_Asignamatricula.MATRICULA
    FROM Tb_Asignamatricula
    WHERE (((Tb_Asignamatricula.[CLIENTE])=(SELECT DIMINUTIVO FROM Tb_Cliente WHERE (ESTADO="ACTIVADO"))))
    ORDER BY Tb_Asignamatricula.[CLIENTE];

    En las tabla Tb_Asignamatricula y Tb_Asignacliente los campos Cliente y DIMINUTIVO tienen los mismo valores, el problema es al generar un nuevo cliente y no tener aún matrícula asignada, me genera error "Esta subconsulta puede devolver como máximo un registro"

    Intenté con LEFT JOIN e INNER JOIN, pero no me sale la respuesta, que debería ser sólo las matrículas que pertenecen a los clientes(DIMINUTIVO) que se encuentran en la tabla Tb_cliente con el estado "Activado"
    domingo, 31 de julio de 2016 10:05

Respuestas

  • Es correcta la idea que tienes de hacerlo con un JOIN. Tiene que funcionar, solo es cuestión de escribir cuidadosamente el JOIN. Más o menos debería quedarte como te pongo a continuación, pero tendrás que pulirlo porque lo he escrito de memoria sin probarlo (ya que no tengo las tablas) y es muy posible que contenga algún error:

    SELECT mat.MATRICULA
    FROM Tb_Asignamatricula mat
    JOIN Tb_Cliente cli ON mat.CLIENTE=cli.DIMINUTIVO
    WHERE cli.ESTADO='ACTIVADO'
    ORDER BY mat.CLIENTE
    

    • Propuesto como respuesta José De Alva lunes, 1 de agosto de 2016 21:26
    • Marcado como respuesta José De Alva miércoles, 3 de agosto de 2016 15:10
    domingo, 31 de julio de 2016 10:58
  • LUIS DIOS,

    Aunque el contexto del hilo deja entrever el resultado que esperas me gustaría que tengas claro la diferencia entre obtener todos los alumnos con matricula versus obtener todos los alumnos sea que tengan matricula o no, son dos escenarios distintos y dependiendo del resultado que esperas debes combinar las filas haciendo uso de INNER JOIN o OUTER JOIN.

    /*Todos los alumnos 'ACTIVOS' con matricula*/
    SELECT 
    	c.DIMINUTIVO,
    	m.MATRICULA
    FROM 
    	tb_Cliente c
    	INNER JOIN  Tb_Asignamatricula m ON (c.DIMINUTIVO = m.CLIENTE)
    WHERE 
    	c.ESTADO = 'ACTIVADO'
    ORDER BY 
    	c.CLIENTE;
    
    
    /*Todos los alumnos 'ACTIVOS' tengan o no matricula*/
    SELECT 
    	c.DIMINUTIVO,
    	ISNULL(m.MATRICULA, 'SIN MATRICULA')
    FROM 
    	tb_Cliente c
    	LEFT JOIN  Tb_Asignamatricula m ON (c.DIMINUTIVO = m.CLIENTE)
    WHERE 
    	c.ESTADO = 'ACTIVADO'
    ORDER BY 
    	c.CLIENTE;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta José De Alva lunes, 1 de agosto de 2016 21:26
    • Marcado como respuesta José De Alva miércoles, 3 de agosto de 2016 15:10
    domingo, 31 de julio de 2016 15:43

Todas las respuestas

  • Es correcta la idea que tienes de hacerlo con un JOIN. Tiene que funcionar, solo es cuestión de escribir cuidadosamente el JOIN. Más o menos debería quedarte como te pongo a continuación, pero tendrás que pulirlo porque lo he escrito de memoria sin probarlo (ya que no tengo las tablas) y es muy posible que contenga algún error:

    SELECT mat.MATRICULA
    FROM Tb_Asignamatricula mat
    JOIN Tb_Cliente cli ON mat.CLIENTE=cli.DIMINUTIVO
    WHERE cli.ESTADO='ACTIVADO'
    ORDER BY mat.CLIENTE
    

    • Propuesto como respuesta José De Alva lunes, 1 de agosto de 2016 21:26
    • Marcado como respuesta José De Alva miércoles, 3 de agosto de 2016 15:10
    domingo, 31 de julio de 2016 10:58
  • LUIS DIOS,

    Aunque el contexto del hilo deja entrever el resultado que esperas me gustaría que tengas claro la diferencia entre obtener todos los alumnos con matricula versus obtener todos los alumnos sea que tengan matricula o no, son dos escenarios distintos y dependiendo del resultado que esperas debes combinar las filas haciendo uso de INNER JOIN o OUTER JOIN.

    /*Todos los alumnos 'ACTIVOS' con matricula*/
    SELECT 
    	c.DIMINUTIVO,
    	m.MATRICULA
    FROM 
    	tb_Cliente c
    	INNER JOIN  Tb_Asignamatricula m ON (c.DIMINUTIVO = m.CLIENTE)
    WHERE 
    	c.ESTADO = 'ACTIVADO'
    ORDER BY 
    	c.CLIENTE;
    
    
    /*Todos los alumnos 'ACTIVOS' tengan o no matricula*/
    SELECT 
    	c.DIMINUTIVO,
    	ISNULL(m.MATRICULA, 'SIN MATRICULA')
    FROM 
    	tb_Cliente c
    	LEFT JOIN  Tb_Asignamatricula m ON (c.DIMINUTIVO = m.CLIENTE)
    WHERE 
    	c.ESTADO = 'ACTIVADO'
    ORDER BY 
    	c.CLIENTE;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta José De Alva lunes, 1 de agosto de 2016 21:26
    • Marcado como respuesta José De Alva miércoles, 3 de agosto de 2016 15:10
    domingo, 31 de julio de 2016 15:43