SQL - Duplicación de FILAS EN SQL

 
Vista:
sin imagen de perfil

Duplicación de FILAS EN SQL

Publicado por Fabrizio (3 intervenciones) el 03/06/2022 16:59:08
Hola como están, soy nuevo en SQL y me encuentro con un problema

Tengo que hacer una sentencia con 2 tablas unidas mediante una 3ra tabla intermedia, la sentencia me tiene que mostrar codigo de usuario, nombre y si pertenece a un grupo seleccionado(el cual tiene que estar mostrado en booleano), que a motivos de ejemplo use el grupo 17

Hice esta sentencia

SELECT usu.usuario, usu.nombre, CAST(CASE gru.grupo WHEN 17 THEN 1 ELSE 0 END AS bit) AS pertenece
FROM Usuarios AS usu
INNER JOIN GruposUsuarios AS grus ON usu.usuario = grus.usuario
INNER JOIN Grupos AS gru ON grus.grupo = gru.grupo
Order by usu.usuario

El problema se me da en que me carga duplicados solo algunas filas y no le encuento la vuelta, creo que debe haber algún conflicto con el CASE o los JOIN pero no encuentro nada que me pueda ayudar

Esta es la imagen de como me da la query
QUERY


Y aqui las tablas en cuestion

GruposUsuarios

Usuarios

Grupos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duplicación de FILAS EN SQL

Publicado por gilman (103 intervenciones) el 04/06/2022 09:05:07
El problema es que la consulta te devuelve un registro por cada grupo al que pertenece el usuario, así que como, por ejemplo, SUAREZ LUISA pertenece a 2 grupos, te devuelve 2 registros uno para el grupo RIVER PLATE y otro para el grupo UBUNTU, en el primer caso el campo grupo vale 17, y por lo tanto PERTENECE toma valor 1, y en el segundo grupo vale 28 y por lo tanto PERTENECE toma valor 0.
Prueba la siguiente consulta:
1
2
3
4
5
SELECT usu.usuario, usu.nombre, NVL2(grus.grupo, 1, 0) AS pertenece
FROM Usuarios AS usu
LEFT JOIN (SELECT GruposUsuarios.grupo FROM GruposUsuarios WHERE grupo = 17) AS grus
	ON usu.usuario = grus.usuario
ORDER BY usu.usuario
que devolverá todos los usuarios que haya en la tabla Usuarios y el campo grus.grupo valdrá 17 si hay un registro en la subconsulta:
1
SELECT GruposUsuarios.grupo FROM GruposUsuarios WHERE grupo = 17
o NULL si no pertenece.
Está pensada para ORACLE, así que, si no usas ORACLE, tendrás que buscar un equivalente a NVL2 que es una función que si el primer parámetro es no nulo devuelve el segundo parámetro, y el tercero si es nulo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Duplicación de FILAS EN SQL

Publicado por Fabrizio (3 intervenciones) el 04/06/2022 17:56:37
1
2
3
4
5
SELECT usu.usuario, usu.nombre, COALESCE(grus.grupo, 1, 0) AS pertenece
FROM Usuarios AS usu
LEFT JOIN (SELECT GruposUsuarios.grupo FROM GruposUsuarios WHERE grupo = 17) AS grus
	ON usu.usuario = grus.usuario
ORDER BY usu.usuario

me queda asi pero no me reconoce el grus.usuario en el LEFT join, me reconoce unicamente la columna grupo
aaaa

Gracias por tu respuesta!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Duplicación de FILAS EN SQL

Publicado por Fabrizio (3 intervenciones) el 04/06/2022 19:24:27
Le di un par de vueltas más y me funcionó de este manera, muchas gracias!
1
2
3
4
5
SELECT usu.usuario, usu.nombre, CAST(CASE grus.grupo WHEN 17 THEN 1 ELSE 0 END AS bit) AS pertenece
FROM Usuarios AS usu
LEFT JOIN (SELECT GruposUsuarios.grupo, GruposUsuarios.usuario FROM GruposUsuarios WHERE grupo = 17) AS grus
	ON usu.usuario = grus.usuario
ORDER BY usu.usuario
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar