现在有一张用户表, 一张地址表, 地址表中有用户的主键.
请问现在想实现每条用户记录之间要放入多个地址信息, 假定从两张表中获取的列是相同的, 请问可以类似 Tree 的形式吗? 如果可以,能不能告知一下搜索的关键词.MySQL/Oracle 求教.
表头 |表头 | 表头|
张三 |12 岁 | 男 |
上海 |徐汇区|xx 街道|
江苏 |南京 | xx 街道|
李四 |34 岁 | 男 |
湖北 |武汉 | xx 街道|
....
1
allAboutDbmss 2020-07-24 23:24:57 +08:00
没看特别明白
给个输出的例子吧 |
2
ysoserious 2020-07-25 13:00:28 +08:00
关键词 join
输出结果 表头 |表头 | 表头| 表头 | 表头 | 表头 | 张三 |12 岁 | 男 | 上海 |徐汇区 | xx 街道| 张三 |12 岁 | 男 | 江苏 |南京 | xx 街道| 李四 |34 岁 | 男 | 湖北 |武汉 | xx 街道| ---- 如果必须要用数据库语句输出你那种结构的话, 可以试试 MySQL 的存储过程. |
3
aizya OP @ysoserious 非常感谢, 存储过程感觉也不好写. 我先找找存储过程有没有类似代码的处理方式, 先查主表,然后循环主表内容查子表,然后再拼接..
|
4
aizya OP 结贴了, 最后是研究存储过程搞定了. 通过游标和临时表, 最终实现了功能.
伪代码: ``` DROP PROCEDURE IF EXISTS COMBINE_RESULT_SET; CREATE PROCEDURE COMBINE_RESULT_SET() BEGIN -- 定义要在 DROP TABLE 的前面, 要显示在最前面 DECLARE s INT DEFAULT 0; DECLARE TASKID INT(11); -- 定义游标,并将 SQL 结果集赋值到游标中 DECLARE IDLIST CURSOR FOR SELECT ID FROM PL_TASK; -- 声明当游标遍历完后将标志变量置成某个值 DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1; -- SQL Error [1337] [42000]: Variable or condition declaration after cursor or handler declaration DROP TABLE IF EXISTS USER_TEMPORARY; -- 创建临时表 CREATE TEMPORARY TABLE IF NOT EXISTS USER_TEMPORARY(NAME VARCHAR(32), DESCRIPTION VARCHAR(225)); -- 打开游标 OPEN IDLIST; -- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和 SQL 结果列的顺序一致 FETCH IDLIST INTO TASKID; -- 当 S 不等于 1,也就是未遍历完时,会一直循环 WHILE s<>1 DO -- 执行业务逻辑 -- INSERT INTO USER_TEMPORARY(NAME, DESCRIPTION) VALUES (SELECT USER_NAME, EMAIL FROM PL_USER WHERE PL_USER.ID = TASKID) ; -- INSERT INTO USER_TEMPORARY(NAME, DESCRIPTION) VALUES (SELECT TASK_NO, TASK_TITLE FROM PL_TASK WHERE CREATE_BY = TASKID) ; INSERT INTO USER_TEMPORARY(SELECT USER_NAME, EMAIL FROM PL_USER WHERE PL_USER.ID = TASKID) ; INSERT INTO USER_TEMPORARY(SELECT TASK_NO, TASK_TITLE FROM PL_TASK WHERE CREATE_BY = TASKID) ; -- 将游标中的值再赋值给变量,供下次循环使用 FETCH IDLIST INTO TASKID; -- 当 S 等于 1 时表明遍历以完成,退出循环 END WHILE; -- 关闭游标 CLOSE IDLIST; SELECT * FROM USER_TEMPORARY; END CALL COMBINE_RESULT_SET(); ``` |