如何在SQL中连接来自不同列的数据

如何在SQL中连接来自不同列的数据,sql,oracle,Sql,Oracle,有人能一步一步地给我解释一下我怎么能做这种练习吗 假设我有两张桌子 用户[id,用户名,图书id] 书[id、标题、日期] 如何获得此结构: [user_name, list_of_book_and_dates]. 差不多 John | book1 at 10.10.2019, book2 at 15.15.2019 似乎您需要一个listag函数- SELECT U.user_name, LISTAGG(B.title || 'at' || B.date, ',') WITHIN G

有人能一步一步地给我解释一下我怎么能做这种练习吗

假设我有两张桌子

  • 用户[id,用户名,图书id]
  • 书[id、标题、日期]
如何获得此结构:

[user_name, list_of_book_and_dates].
差不多

 John | book1 at 10.10.2019, book2 at 15.15.2019

似乎您需要一个listag函数-

SELECT U.user_name, LISTAGG(B.title || 'at' || B.date, ',') WITHIN GROUP (ORDER BY B.date)
FROM users U
JOIN book B ON U.book_id = B.id
GROUP BY U.user_name
如果严格需要使用递归CTE方法,可以使用-

WITH TMP AS (SELECT U.user_name, B.title || 'at' || B.date book_detail, ROW_NUMBER() OVER (PARTITION BY user_name) RN
             FROM users U
             JOIN book B ON U.book_id = B.id),
 cte AS (SELECT user_name, book_detail, RN
         FROM TMP
         WHERE RN = 1
         UNION ALL
         SELECT T.user_name, C.book_detail || ', ' || T.book_detail, C.RN+1
         FROM TMP T
         JOIN cte C ON U.id = C.id
         WHERE T.user_name = C.user_name
         and C.RN + 1 = T.rn)
SELECT user_name, book_detail 
FROM cte C1
WHERE RN = (SELECT MAX(RN)
            FROM cte C2
            WHERE C1.user_name = C2.user_name)

非常感谢你。这就成功了。然而,我怎样才能以递归的方式来实现这一点?你所说的
递归方式是什么意思?
?如果可能的话,使用“recursive With”我认为这里没有任何必要专门使用递归CTE。你还需要它吗?我必须做一个家庭作业,它指定我需要使用递归查询做类似的事情。Listag函数很好,看起来是一个不错的选择,但我想了解如何使用递归查询来实现它