none
consulta de muchas tablas

    Question

  • hola a todos

    lo que necesito es esto

    tengo tres tablas importantes Pacientes, Catalogos, Vacunacion

    Pacientes tiene muchos campos pero el mas importante es el id, nombre, apellidoPaterno

    Catalogos tiene idTipoCatalogo, idCategoria, descripcion

    y Vacunacion tiene id, idPaciente, idVacuna, Dosis que dosis es tipo datetime

    como pueden ver pues las llaves foraneas y llaves primarias se explican solo por su nombre

    ahora la tabla vacunacion pues se llena de un paciente, una vacuna y la fecha en que se puso

    es importante decir que la vacuna es igual a la consulta de catalogo donde idTipoCatalogo = 10

    que es lo que quiero hace???

    DECLARE 
    @Incluidos bit
    
    set @incluidos = 1
    
    SELECT A.id, A.descripcion as Vacuna,
           B.id,
           C.id, C.nombre, C.apellidoPaterno, C.apellidoMaterno
    FROM Catalogos as A
         left join Vacunacion as B on (B.idVacuna = A.id)
         left join Pacientes as C on (B.idPaciente = C.id and C.id is null)
    
    WHERE A.idTipoCatalogo = 11

    si incluidos = 1 esto quiere decir que necesito todos los pacientes que tengan una algun registro de vacunacion que ya se la a puesto alguna vacuna o muchas no importa, eso si funciona, el problema es si incluidos es null debe traerme a todos los pacientes que esten y que no esten en vacunacion y que me muestre las vacunas que se les a aplicado y las que no osea todo el resultado debe ser todas las vacunas para cada paciente de la tabla catalogos y todas las vacunas para cada paciente de la tabla vacunacion.

    si incluidos es = 0 quiere decir que solo debe mostrar las pacientes que no tienen registros en vacunacion por lo tanto es logico pensar que deben aparacer los registros de pacientes con los registros de catalogos, y todos en null, espero a verme dado a entender y que alguien me pueda ayudar con esta consulta

    Thursday, October 18, 2012 8:57 PM

Answers

  • Amigo me parece que el problema esta con el INNER JOIN DE VACUNACION:
    FROM Pacientes as A  inner join Vacunacion as B
    ya que para todos los que no tengan vacunas no van a estar en esa tabla por lo tanto no habrá coincidencia. Deberías probar con un LEFT JOIN.
    Select * FROM Pacientes as A left join Vacunacion as B on(A.id = B.idPaciente) ya que esto te traera todos los resultados, para los cuales B.idPaciente sea NULL seran los no vacunados.
    Espero estar en lo cierto y haber ayudado.
    Saludos

    Lic. Germán Balestra

    • Marked as answer by niqel Wednesday, October 24, 2012 6:56 PM
    Monday, October 22, 2012 6:58 PM

All replies

  • Hola.

    Facilítanos scripts de creación de las tablas implicadas, scripts de inserción de datos de ejemplo y recordset esperado. No se entiende muy bien cuál es tu propósito en cualquier caso. Por ejemplo, no usas la variable @incluidos y el cruce con la tabla "Pacientes" es casi seguro que está mal.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Friday, October 19, 2012 7:03 AM
  • mira esta es la consulta que me permite pasar un filtro o no, que era lo que yo queria, es para hacer una busqueda personalizada

    DECLARE 
    @id int,
    @idBase int,
    @idDepartamento int,
    @idPuesto int,
    @sexo nvarchar,
    @idVacuna int,
    @fechaInicial Datetime,
    @fechaFinal Datetime,
    
    set @id = null;
    set @idBase = null;
    set @idDepartamento = null;
    set @idPuesto = null;
    set @sexo = null;
    set @idVacuna = null;
    set @fechaInicial = null;
    set @fechaFinal = null;
    set @incluidos = 0;
    
    SELECT DISTINCT A.*,
                    B.id as idVacunacion, B.idVacuna,
                    C.descripcion as Vacuna,
                    D.descripcion as Base,
                    E.NOMDEP as Departamento,
                    B.dosis
    FROM Pacientes as A
         inner join Vacunacion as B on(B.idPaciente = A.id)
         inner join Catalogos as C on (B.idVacuna = C.id)
         inner join nom_ubipag as D on (A.idBase = D.idubipag)
         inner join Departamentos as E on (A.idDepartamento = E.iddep)
    WHERE ((A.id = @id)or(@id is null))
      and ((A.idBase = @idBase)or(@idBase is null))
      and ((A.idDepartamento = @idDepartamento)or(@idDepartamento is null))
      and ((A.idPuesto = @idPuesto)or(@idPuesto is null))
      and ((A.sexo = @sexo)or(@sexo is null))
      and ((B.idVacuna = @idVacuna)or(@idVacuna is null))
      and ((B.dosis >= @fechaInicial)or(@fechaInicial is null))
      and ((B.dosis <= @fechaFinal)or(@fechaFinal is null))

    pero este consulta siempre me regresa los que estan en la tabla vacunacion, todos los pacientes que estan en la tala vacunacion los puedo filtrar con cualquier @parametro, funciona perfectamente.

    ahora que me falta asi como se puede consultar a todos los pacientes que se les ha aplicado a alguna vacuna, necesito traerme a todos los pacientes que no que no tengan vacunas, por ejemplo si hay 7 vacunas en el catalogo y un empleado tiene 2, y otros empleados ninguna, y asi puede haver varios, necesito que me muestre todos los empleados que les falte alguna vacuna y que me diga que vacuna le falta si es un empleado que no tiene ninguna vacuna pues me debe mostrar 7 registros de ese empleado con el nombre de las vacunas faltantes y el campo dosis en null, espero averme dado a entender, creo que seria bueno implementar una subconsulta.

    Friday, October 19, 2012 7:43 AM
  • Amigo me parece que el problema esta con el INNER JOIN DE VACUNACION:
    FROM Pacientes as A  inner join Vacunacion as B
    ya que para todos los que no tengan vacunas no van a estar en esa tabla por lo tanto no habrá coincidencia. Deberías probar con un LEFT JOIN.
    Select * FROM Pacientes as A left join Vacunacion as B on(A.id = B.idPaciente) ya que esto te traera todos los resultados, para los cuales B.idPaciente sea NULL seran los no vacunados.
    Espero estar en lo cierto y haber ayudado.
    Saludos

    Lic. Germán Balestra

    • Marked as answer by niqel Wednesday, October 24, 2012 6:56 PM
    Monday, October 22, 2012 6:58 PM