0

次のテーブルがあります。

学生

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

ここで、Users テーブルから検索された外部キー値MessageFromを返します。学生は従業員にメッセージを送信でき、その逆も可能です。また、学生と従業員の間で送信することもできます。MessageToUserID

4

2 に答える 2

2

これは再びXY問題だと思います。

なぜUsers2 つに分割したのですか?

このようにしないのはなぜですか(これで問題全体が解決します):

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

このようにして、ユーザー用のテーブルが 3 つではなく 2 つになりました。すべてのユーザーと名前は同じテーブルにあります

于 2012-07-27T16:00:06.467 に答える
1

メッセージが学生または従業員に関連しているかどうかは気にしないので、これらの 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
于 2012-07-27T15:56:10.137 に答える