【问题标题】:SQL: View Full Name From User ID (Send To / Send From)SQL:查看用户 ID 的全名(发送至/发送自)
【发布时间】:2012-07-27 15:46:32
【问题描述】:

我有以下表格:

学生

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 从位于用户表中的UserID 返回一个外键值。学生可以向员工发送消息,反之亦然。他们还可以在学生和员工之间发送。

【问题讨论】:

  • 你的结构好像有点问题

标签: sql sql-server join foreign-keys


【解决方案1】:

我想这又是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 在同一个表中。

【讨论】:

  • 我同意这是一个更好的结构,但是尽管能够改变架构,OP 仍然可以查询他们需要的数据。
  • 是的,我刚刚阅读了您的查询,它会起作用。但我仍然认为数据库规范化是第一步。一个好的结构可以防止你遇到噩梦般的查询和问题。但是,如果 OP 无法更改他必须使用您的查询的结构,那么您是对的
  • 更重要的是,用户名不需要是一个单独的表,没有理由将它们与其他值一起违反正常形式。
  • 进入这个结构时我看到的唯一问题是,StudentID 空间和 EmployeeID 空间是否不应该是相同的。您的解决方案确实删除了一列,但对于 OP 的实现来说可能没有必要。
  • 是的,尽管没有说明或解释它很重要,所以我投票支持错误的结构。 OP 会告诉我们我猜
【解决方案2】:

这应该可以解决问题,因为您不在乎消息是否与学生或员工相关,您可以将这 2 个表合并。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2021-04-26
    • 2016-05-08
    • 2023-04-05
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多