2016-04-06 35 views
0

我有一個看起來有點像這樣的兩個表:如何加入兩個表,並從表中的兩個匹配字段出現在一行

User table     Roles table 
    [id][name]     [Userid][value] 
    1 Tom      1  3 
    2 Bob      1  4 
            2  3   

我想知道如何得到的結果看起來像這樣:

[id][name][userid1][value1][userid2][value2] 
1 Tom  1  3  1  4 
2 Bob  2  3 

當我要求角色表中的匹配值。
有沒有辦法做到這一點,而不必使用遊標?

+2

使用支點來解決的東西,但它是需要固定的列 –

+1

爲什麼鮑勃在你的例子中有value1 = 4而不是value1 = 3? – StephaneM

+0

導致我錯誤輸入。沒有通知使用這種解決方案 – Sniffleeu

回答

0

可以使用ROW_NUMBER()解析函數與數每行的每個用戶,那麼你可以使用聚合函數(即MAX()),包括同一行中多個值:

SELECT u.id, 
     u.name, 
     r.value1, 
     r.value2 
FROM users u 
     LEFT OUTER JOIN 
     (
     SELECT userid, 
       MAX(CASE rn WHEN 1 THEN value END) AS value1, 
       MAX(CASE rn WHEN 2 THEN value END) AS value2 
     FROM (
      SELECT userid, 
        value, 
        ROW_NUMBER() OVER (PARTITION BY UserID 
             ORDER BY value) AS rn 
      FROM roles 
     ) 
     GROUP BY userid 
     ) r 
     ON (u.id = r.userid) 
+0

抱歉,我將不得不知道我需要多少列?我是否正確理解這一點? – Sniffleeu

+0

是的。儘管可以對未知數量的列進行[動態數據透視表](https://asktom.oracle.com/pls/apex/f?p=100:11:0%3A%3A%3A%3Ap11_question_id: 4843682300346852395)它通常需要動態SQL,我期望它不會非常高效。也可能您的前端(假設您沒有使用純SQL)可以轉換數據,並且可能會更好地考慮這一點,而不是通過Oracle來完成。 – MT0

相關問題