pilih tiga detail pertama dari hubungan master-detail dalam tampilan

Saya memiliki hubungan detail utama antara seseorang dan teman-temannya:

orang

id name
-- ------
 1 Jones
 2 Smith
 3 Norris

teman

id personId friendName
-- -------- ----------
 1        1 Alice
 2        1 Bob
 3        1 Charly
 4        1 Deirdre
 5        2 Elenor

Seseorang dapat memiliki teman sebanyak yang dia inginkan. Saya ingin membuat tampilan yang memilih semua orang bersama dengan tiga teman pertama yang ditemukan; sesuatu seperti ini:

id name   friend1 friend2 friend3
-- ----   ------- ------- -------
 1 Jones  Alice   Bob     Charly
 2 Smith  Elenor  <null>  <null>
 3 Norris <null>  <null>  <null>

Bagaimana saya melakukan ini dengan SQL standar? (Microsoft SQL Server 2005).


person Dirk Moebius    schedule 06.09.2010    source sumber


Jawaban (1)


    SELECT p.Id, p.name,
            MAX(CASE RowNum
                WHEN 1 THEN
                 FriendName
                ELSE
                 NULL
             END) Friend1,
            MAX(CASE RowNum
                WHEN 2 THEN
                 FriendName
                ELSE
                 NULL
             END) Friend2,
            MAX(CASE RowNum
                WHEN 3 THEN
                 FriendName
                ELSE
                 NULL
             END) Friend3
     FROM   Person p
     LEFT   JOIN (SELECT id, PersonId, FriendName,
                        ROW_NUMBER() OVER(PARTITION BY PersonId ORDER BY id) RowNum
                 FROM   Friends) f
     ON     f.PersonId = p.Id
    GROUP  BY p.Id, p.Name

hasil:

1   Jones   Alice   Bob Charly
3   Norris  NULL    NULL    NULL
2   Smith   Elenor  NULL    NULL
person Michael Pakhantsov    schedule 06.09.2010
comment
+1, else null adalah mubazir, tanpa ada when yang cocok, case mengembalikan null secara default - person Andomar; 06.09.2010