เลือกรายละเอียดสามรายการแรกของความสัมพันธ์หลัก-รายละเอียดในมุมมอง

ฉันมีความสัมพันธ์รายละเอียดหลักระหว่างบุคคลและเพื่อน:

บุคคล

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

เพื่อน

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

บุคคลสามารถมีเพื่อนได้มากเท่าที่ต้องการ ฉันต้องการสร้างมุมมองที่เลือกบุคคลทั้งหมดพร้อมกับเพื่อนสามคนแรกที่พบ บางอย่างเช่นนี้:

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

ฉันจะทำอย่างไรกับ SQL มาตรฐาน? (ไมโครซอฟต์ SQL เซิร์ฟเวอร์ 2005)


person Dirk Moebius    schedule 06.09.2010    source แหล่งที่มา


คำตอบ (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

ผลลัพธ์:

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 นั้นซ้ำซ้อน หากไม่มีการจับคู่ when เคสจะส่งคืนค่าว่างตามค่าเริ่มต้น - person Andomar; 06.09.2010