Si: tienes un problema de datos o de lógica.
Por empezar, no hables de "4 primeras lineas" eso es incorrecto. Lo que importa es que se cumplan
las condiciones del WHERE. Las otras son parte de la consulta, las
condiciones de una consulta aplican pura y exclusivamente sobre el WHERE...
siempre.
Bien, yendo al problema:
Código SQL:
Ver originalSELECT I.IdInscripcion, I.IdStatus
FROM inscripciones I , estatus E
WHERE
I.Temporal='D'
AND I.IdEvento=1
AND (I.idstatus="" OR E.IdOptionStatus BETWEEN 4 AND 7);
Esta consulta es un espanto de ineficiencia e incorrección.
Si las dos tablas no tienen un campo en en común, con exactamente el mismo nombre, estarías creando un
producto cartesiano, con lo que forzosamente debe devolverte registros, ya que mezcla todo lo de la primera tabla con todo lo de la segunda. Porque simplemente siempre habrá al menos un registro, en toda esa mezcla que coincida en alguna cosa.
Para realizar un JOIN debes indicar el campo que los relaciona. Supongamos:
Código SQL:
Ver originalSELECT I.IdInscripcion, I.IdStatus
FROM inscripciones I INNER JOIN estatus E ON I.idstatus = E.idstatus;
Luego, además hay que asegurarse de que las condiciones se cumplen. pero en un JOIN donde relacionas ambas tablas por el IDSTATUS,
ese valor forzosamente debe existir, por ende no debería haber un campo de la primera tabla que tenga cero o esté vacío:
Código SQL:
Ver originalSELECT I.IdInscripcion, I.IdStatus
FROM inscripciones I INNER JOIN estatus E ON I.idstatus = E.idstatus
WHERE
I.Temporal='D'
AND I.IdEvento=1
AND E.IdOptionStatus BETWEEN 4 AND 7;
Si la idea es que te devuelva inscripciones, aunque no existan estados relacionados, todo lo que hiciste está mal de entrada:
Código SQL:
Ver originalSELECT I.IdInscripcion, I.IdStatus
FROM inscripciones I LEFT JOIN estatus E ON I.idstatus = E.idstatus
WHERE
I.Temporal='D'
AND I.IdEvento=1
AND (E.IdOptionStatus BETWEEN 4 AND 7 OR E.idstatus IS NULL);
¿Se entiende?