2

私は2つのテーブルを持っています:

Table Users

UserId     Name
1          John
2          Alice
3          Tom
4          Charles

Table Clients

Id         Name1          Name2      Name3
1            1              3          4
2            2              1          3

SQLクエリを作成したいのですが

Clients.Id = 1

結果は次のようになります。


Id         Name1          Name2       Name3
1          John            Tom       Charles

INNER JOINを使用すると、クライアントの各列に対してこれを実行できますが、レコード全体(3つの列すべて)に対しては実行できません。

4

3 に答える 3

5

usersテーブルに3回テーブルを結合する必要がありますclient

SELECT  a.ID,
        b.name name1,
        c.name name2,
        d.name name3
FROM    clients a
        INNER JOIN users b
            ON a.name1 = b.userID
        INNER JOIN users c
            ON a.name2 = c.userID
        INNER JOIN users d
            ON a.name3 = d.userID
WHERE   a.ID = 1

SQLFiddleデモ

于 2012-10-02T09:16:22.753 に答える
1

名前ごとに1回Usersテーブルに参加する必要があります。3つの列がある場合、1つ以上がNULL可能である可能性が高いため、内部結合よりも左結合が必要になる可能性が高くなります。

   select c.id, u1.name name1, u2.name name2, u3.name name3
     from Clients c
left join Users u1 on u1.UserId = c.name1
left join Users u2 on u2.UserId = c.name2
left join Users u3 on u3.UserId = c.name3
    where c.Id = 1
于 2012-10-02T09:23:07.890 に答える
1

過度の参加を必要としないもう1つのオプションがあります

SELECT c.Id, MAX(CASE WHEN u.UserID = c.Name1 THEN u.Name END) AS Name1,
             MAX(CASE WHEN u.UserID = c.Name2 THEN u.Name END) AS Name2,
             MAX(CASE WHEN u.UserID = c.Name3 THEN u.Name END) AS Name3
FROM dbo.Users u JOIN dbo.Clients c ON u.UserId IN (c.Name1, c.Name2, c.Name3)
WHERE c.Id = 1
GROUP BY c.Id
于 2012-10-02T12:08:10.670 に答える