entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

AYUDA : Consulta SQL para tablas que pueden estar o no relacionadas.

Hola un saludo

Estoy trabajando con una aplicación VB.NET(no tiene importancia realmente) y una base de datos SQL Server. Quiero en mi programa cargar una grilla con la siguiente información:

enter image description here

Ahora las tablas relacionadas son éstas :

enter image description here

Para cada tabla, el elemento codigo es la llave primaria, y fkcodigo... hace referencia a una llave foránea.
IMPORTANTE A SEÑALAR: En la tabla PARTICULAR, las llaves foráneas fk_codigo_ciudad, fk_codigo_vereda pueden ser NULL, es decir, no necesariamente un PARTICULAR está relacionado a una CIUDAD y a una VEREDA.

Ahora la grilla de mi programa se carga con ésta consulta:

SELECT P.cedula 'Cedula', P.nombre 'Nombre', P.apellido 'Apellido', P.telefono 'Teléfono', C.nombre 'Ciudad', V.nombre 'Vereda', R.finca 'Finca'  FROM PERSONA P, CIUDAD C, PARTICULAR R, VEREDA V WHERE P.codigo = R.fk_codigo_persona AND C.codigo = R.fk_codigo_ciudad AND V.codigo = R.fk_codigo_vereda AND P.tipo_persona = 'Particular' ORDER BY P.cedula

AHORA LO CONSULTA NO ME MUESTRA PARTICULARES QUE NO TENGAN fk_codigo_ciudad, fk_codigo_vereda REGISTRADOS, Y NECESITO CARGAR EN LA GRILLA TANTO A PARTICULARES QUE TENGAN CIUDAD, VEREDA RELACIONADAS ASI COMO AQUELLOS QUE NO, EN CASO DE QUE NO TENGAN PUES QUE EN LA GRILLA APAREZCAN SÓLO LOS CAMPOS CIUDAD,VEREDA EN BLANCO.

HAY ALGÚN MODO DE MODIFICAR LA CONSULTA SQL PARA QUE ME DEVUELVA EL RESULTADO DE DICHO MODO ?

2 Respuestas

5votos

carlossevi Puntos63540

Pasa este tipo de consultas te recomiendo el uso de join, y para este caso en concreto en el que quieres recuperar todos los registros aunque no estén relacionados a través de la clave foránea el interesante es el left join.

La consulta quedaría (sin comprobar):

SELECT
    P.cedula Cedula, 
    P.nombre Nombre, 
    P.apellido Apellido, 
    P.telefono Teléfono, 
    C.nombre Ciudad, 
    V.nombre Vereda, 
    R.finca Finca  
FROM 
    PARTICULAR R
    JOIN PERSONA P ON P.codigo = R.fk_codigo_persona
    LEFT JOIN CIUDAD C ON C.codigo = R.fk_codigo_ciudad
    LEFT JOIN VEREDA V ON V.codigo = R.fk_codigo_vereda
WHERE
    -- Aquí posibles clausulas WHERE
ORDER BY P.cedula

0voto

Dr oscar comentado

Muchisimas gracias :D

Ahora una pequeña duda extra:
Si ahora tuviese una tabla DEPARTAMENTO y la tabla CIUDAD estuviera relacionada a ésta por llave foránea y quisiera obtener además de los campos de consulta anterior también el "codigo" y "nombre" del departamento donde el campo fk_codigo_dept de la tabla CIUDAD sea igual al codigo de la tabla DEPARTAMENTO.

Estaba intentando hacerlo con JOIN pero no lo manejo muy bien y lo planteé incorrectamente de éste modo:

SELECT 
     P.codigo 'cod_persona',
     P.cedula 'cedula', 
     P.nombre 'nombre', 
     P.apellido 'apellido', 
     P.telefono 'telefono',
     P.correo 'correo',
     D.codigo 'cod_dept',
     D.nombre 'departamento',   
     C.codigo 'cod_ciudad',
     C.nombre 'ciudad', 
     V.codigo 'cod_vereda', 
     V.nombre 'vereda', 
     R.codigo 'cod_particular', 
     R.finca 'finca',
FROM 
     PARTICULAR R, CIUDAD C 
     JOIN PERSONA P ON P.codigo=R.fk_codigo_persona
     JOIN DEPARTAMENTO D ON D.codigo=C.fk_codigo_dept 
     LEFT JOIN ON C.codigo = R.fk_codigo_ciudad 
     LEFT JOIN VEREDA V ON V.codigo= R.fk_codigo_vereda 
ORDER BY P.cedula

Cuál sería el modo correcto?

1voto

carlossevi comentado

No es correcta la sintaxis para incluir CIUDAD, la has quitado del JOIN (queda mal la sintaxis) y la has añadido al FROM con una coma. Hay que sustituir esto:

FROM 
     PARTICULAR R, CIUDAD C 
     JOIN PERSONA P ON P.codigo=R.fk_codigo_persona
     JOIN DEPARTAMENTO D ON D.codigo=C.fk_codigo_dept 
     LEFT JOIN ON C.codigo = R.fk_codigo_ciudad 
     LEFT JOIN VEREDA V ON V.codigo= R.fk_codigo_vereda 

Por esto:

FROM 
     PARTICULAR R 
     JOIN PERSONA P ON P.codigo = R.fk_codigo_persona   
     LEFT CIUDAD C JOIN ON C.codigo = R.fk_codigo_ciudad 
     LEFT JOIN VEREDA V ON V.codigo = R.fk_codigo_vereda 
     JOIN DEPARTAMENTO D ON D.codigo = C.fk_codigo_dept 

Piensa si hay ciudades sin departamento y de qué tipo debe ser el join (inner, left, right o full).

1voto

Dr oscar comentado

Disculpa, tenias ciertos errores pero entendí lo que hacia :)
quedaba así :

FROM
     PARTICULAR R 
     JOIN PERSONA P ON P.codigo = R.fk_codigo_persona   
     LEFT JOIN CIUDAD C ON C.codigo = R.fk_codigo_ciudad 
     LEFT JOIN VEREDA V ON V.codigo = R.fk_codigo_vereda 
     LEFT JOIN DEPARTAMENTO D ON D.codigo = C.fk_codigo_dept 

Muchas gracias en serio :D

2votos

PicaPiedras Puntos740

aqui te dejo una pequeña chuleta. justo antier twitie esta img

sql join

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta