SQL - consultas sql

 
Vista:
Imágen de perfil de Carmen

consultas sql

Publicado por Carmen (5 intervenciones) el 15/10/2021 21:15:06
Buenas tardes. De antemano agradezco su ayuda en mi consulta.
tengo las siguientes tablas:
CREATE TABLE user(
usr_cellphone BIGINT NOT NULL,
usr_firstname VARCHAR(45)NOT NULL,
usr_lastname VARCHAR(45)NOT NULL,
usr_cc BIGINT NOT NULL,
usr_birthdate DATE NOT NULL,
usr_balance FLOAT NOT NULL,
usr_password VARCHAR(45) NOT NULL,
PRIMARY KEY (usr_cellphone)
);

CREATE TABLE transfer(
trans_id BIGINT NOT NULL,
trans_date DATE NOT NULL,
id_remitter BIGINT NOT NULL,
id_receiver BIGINT NOT NULL,
trans_amount FLOAT NULL,
PRIMARY KEY (trans_id),
FOREIGN KEY (id_remitter) REFERENCES user(usr_cellphone),
FOREIGN KEY (id_receiver) REFERENCES user(usr_cellphone)
);


y necesito hacer la siguiente con sulta sobre la tabla transfer:
nombre completo del remitente (id_remitter), nombre completo del destinatario(id_receiver), monto transferido
pero no puedo lograr hacerla, solo logro consultar los remitentes:

select user.usr_firstname, user.usr_lastname, transfer.trans_amount from user inner join transfer
on transfer.id_remitter=user.usr_cellphone;


La consulta que necesito hacer debe devolverme algo asi: (priimero los datos del remitente, luego los datos del que recibe y por ultimo el monto:

Juan Rodriguez|Sophie Quintero|100000.0
Tomas Herrera|David Barreto|50000.0
David Barreto|Sophie Quintero|20000.0
David Barreto|Juan Rodriguez|80000.0

gracias!
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

consultas sql

Publicado por Anonimous (2 intervenciones) el 17/10/2021 01:54:34
Yo lo que veo es que tienes un error de diseño monumental en esas tablas.

Como vas a decir que la FK es el número de celular, digamos que un número telefónico si podría comportarse como clave, pero no es lo usual

Y de hecho la tabla transfer como está tiene dos FK que le apuntan a la misma columna de la otra tabla (user)

FOREIGN KEY (id_remitter) REFERENCES user(usr_cellphone),
FOREIGN KEY (id_receiver) REFERENCES user(usr_cellphone)

Estás diciendo que el usr_cellphone es a la vez el id_remitter y el id_receiver, entonces como distingues unívocamente el uno del otro.

Yo lo que pienso es que ahí hace falta una tercera tabla que normalice, pues sin conocer de fondo la reglas de negocio, supongo que un remitente podrá efectuar muchas transacciones y un receptor igual podrá recibir muchas de ellas, luego eso me diría que estás frente a una relación M:M; y así como está planteado tu modelo, no te sale ese query.

Debería haber una tabla para almacenar los datos del remitter y otra para el receiver, y una intermedia que normalice y que se "roba" las claves de estas, solo en ese caso se podría construir la consulta que requieres
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
Imágen de perfil de Carmen

consultas sql

Publicado por Carmen (5 intervenciones) el 17/10/2021 15:13:01
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
Imágen de perfil de Carmen

consultas sql

Publicado por Carmen (5 intervenciones) el 17/10/2021 15:15:57
select u1.usr_firstname, u1.usr_lastname, u2.usr_firstname, u2.usr_lastname, t.trans_amount from transfer t inner join user u1
on t.id_remitter=u1.usr_cellphone inner join user u2
on t.id_receiver=u2.usr_cellphone;

La anterior es la solucion a mi pregunta, asi deberia hacerse la consulta.
Dejo la solucion pues talvez le sirva a alguien.
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

consultas sql

Publicado por anonimous (2 intervenciones) el 17/10/2021 18:38:10
Pues si es que en la misma estructura conviven user y remitter, podría funcionarte...

Simplemente ingresa datos y mira que te arroja.

Pero lo que te habían mencionado antes, ese modelo está mal planteado, debería haber una estructura para user y otra para remitter, y en medio de ellas una tercera llamada: transfer.

Pero eso realmente está mal diseñado, y entre otras cosas porque user es una palabra reservada y no debería llamarse la tabla así, pero al márgen de esto, definitivamente tu modelo está mal planteado, porque eso daría para una relación M:M y las relaciones de este tipo no se pueden dar, si se dan es porque está mal normalizado (No está en 3FN). y hay que convertirles a 1:M o 1:1 si fuera el caso, que en este no aplica.

Que te puede funcionar como está, es probable, pero te da redundancia y te puede repetir registros...
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