Select

如果橋對可能有 3 名玩家,如何定義選擇?

  • November 19, 2012

通常一對有 2 名球員,但如果俱樂部中有奇數名球員,則一對“對”有 3 名球員。

表,成員:

對,player_id

1 1
1 2
2 3
2 4
3 5
3 6
4 7
4 8
5 9
5 10
6 11
6 12
6 13

桌上玩家:

身份證名稱

1 史密斯
2 棕色
3約翰遜
4 狂野
5 錘子
6 螺栓
7 粉紅色
8 布什
9 諾瓦克
10 國王
11 福爾摩斯
12 華生
13 金

選擇的要求結果是:


Pair, Names
1, Smith - Brown
2, Johnson - Wild
3, Hammer - Bolt
4, Pink - Bush
5, Novak - King
6, Holmes - Watson - Gold

這是 MySQL 解決方案(非常類似於 Leigh 的 Oracle 解決方案):

SELECT Pair
, GROUP_CONCAT(name SEPARATOR ' - ') Names
FROM Members m
JOIN Players p ON m.player_id = p.id
GROUP BY Pair;

強制性sqlfiddle,也是根據 Leigh 的插圖修改的。*

  • 當我抄襲時,我給予信任!

這適用於 SQL Server 2005+ “魔術”是使用 XML 每對連接一組字元串。希望這可以幫助!

WITH Pairs
(   
   Pair
)
AS
(
   SELECT DISTINCT
       m.pair AS Pair
   FROM dbo.members AS m
)
SELECT
   p.Pair,
   REPLACE
   (
       REPLACE
       (
           REPLACE
           (
               CONVERT(VARCHAR(MAX), X.n),
               '</PlayerName><PlayerName>',
               ' - '
           ),
           '</PlayerName>',
           ''
       ),
       '<PlayerName>',
       ''
   ) AS ConcatNames
FROM Pairs AS p

   CROSS APPLY --Create XML string
   (
       SELECT
           pl.name AS PlayerName
       FROM dbo.players AS pl

           INNER JOIN dbo.members AS m
               ON pl.id = m.player_id

       WHERE m.pair = p.Pair

       ORDER BY
           pl.id ASC

       FOR XML PATH(''), TYPE
   ) AS X(n)

ORDER BY
   p.Pair ASC;

引用自:https://dba.stackexchange.com/questions/28659