SQL: ver el nombre completo del ID de usuario (Enviar a/Enviar desde)

Tengo las siguientes tablas:

Estudiantes

StudentID     UserID     FirstName     LastName
1             1          John          Doe
2             3          Peter         Pan
3             5          Mark          Twain

Empleados

EmployeeID     UserID     FirstName     LastName
1              2          Juan          Carlos
2              4          Joe           Reyes
3              6          Ash           Ketchum

Usuarios

UserID     Username
1          test1
2          test2
3          test3
4          test4
5          test5
6          test6

Mensajes

MessageID     MessageFrom     MessageTo     Subject
1             1               2             test message
2             4               3             another test message
3             3               5             another test message

Quiero mostrar la salida como esta

MessageID     MessageFrom     MessageTo     Subject
1             John Doe        Juan Carlos   test message
2             Joe Reyes       Peter Pan     another test message
3             Peter Pan       Mark Twain    another test message

Dónde MessageFrom y MessageTo devuelve un valor de clave externa de UserID ubicado en la tabla Usuarios. Los estudiantes pueden enviar mensajes a los empleados y viceversa. También pueden enviar entre estudiantes y empleados.

preguntado el 27 de julio de 12 a las 16:07

Parece que hay un pequeño problema con su estructura:

2 Respuestas

creo que ésto es El problema XY de nuevo.

¿Por qué dividiste tu Users en dos partes?

¿Por qué no hacerlo así (lo que resolvería todo el problema):

UserID  |   FirstName   |  LastName | UserName |  Type
-------------------------------------------------------
  1           John          Doe        test1       1
  2           Juan          Carlos     test2       2
  3           Mark          Twain      test3       1

Y agregue una tabla Tipos

TypeId  |   TypeName

  1          Students
  2          Employees

De esta manera, tiene 2 tablas para usuarios en lugar de 3. Todos los usuarios y nombres están en la misma tabla que debería ser.

Respondido 27 Jul 12, 17:07

Estoy de acuerdo en que esta es una estructura mucho mejor, sin embargo, sin la capacidad de modificar el esquema, el OP aún puede consultar los datos que necesita. - Esteban H.

Sí, acabo de leer tu consulta y funcionaría. Pero aún creo que la normalización de la base de datos es el primer paso. Una buena estructura evita que tengas consultas y problemas de pesadilla. Pero tiene razón si el OP no puede cambiar la estructura, tendrá que usar su consulta: Phadaphunk

Además, el nombre de usuario no necesita ser una tabla separada, no hay ninguna razón por la que violaría la forma normal tenerlos con los otros valores. - Esteban H.

El único problema que pude ver al ir a esta estructura es si hay alguna razón por la cual el espacio StudentID y el espacio EmployeeID no deberían ser iguales. Su solución deja caer una columna, pero podría ser innecesaria para la implementación del OP. - Esteban H.

Es cierto, aunque no se dice ni explica que es importante, así que voté por una estructura incorrecta. OP nos dirá, supongo - Phadaphunk

Esto debería funcionar, ya que no le importa si el mensaje está relacionado con un estudiante o un empleado, simplemente puede unir esas 2 tablas.

SELECT 
    MessageID,
    (FromTable.FirstName + ' ' + FromTable.LastName) AS MessageFrom,
    (ToTable.FristName + ' ' + ToTable.LastName) AS MessageTo,
    Subject
FROM
    Messages
    INNER JOIN
    (
        (SELECT UserID, FirstName, LastName FROM Students)
        UNION 
        (SELECT UserID, FirstName, LastName FROM Employees)
    ) AS FromTable ON FromTable.UserID = Messages.MessageFrom
    INNER JOIN
    (
        (SELECT UserID, FirstName, LastName FROM Students)
        UNION 
        (SELECT UserID, FirstName, LastName FROM Employees)
    ) AS ToTable ON ToTable.UserID = Messages.MessageTo

Respondido 27 Jul 12, 17:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.