SQL:从用户ID查看全名(发送到/发送)

时间:2012-07-27 15:46:32

标签: sql sql-server join foreign-keys

我有以下表格:

学生

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

员工

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

用户

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

讯息

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

我想像这样显示输出

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

MessageFromMessageTo返回位于Users表中的UserID的外键值。学生可以向员工发送消息,反之亦然。他们也可以在学生和员工之间发送。

2 个答案:

答案 0 :(得分:2)

我认为这又是The X Y Problem

为什么要将Users分为两部分?

为什么不这样做(这将解决整个问题):

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

并添加表格类型

TypeId  |   TypeName

  1          Students
  2          Employees

这样,您可以为用户提供2个表,而不是3个。 所有用户和名称都与it should be位于同一个表中。

答案 1 :(得分:1)

这应该可以解决问题,因为您不关心消息是否与学生或员工有关,您可以将这两个表联合起来。

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