需求,在两张表(一张主表,一张明细表,一对多的关系)中有层级关系,比如A(主表数据),A1,A2,A3,A4(明细表数据),而A1这些数据下面还有别的数据那它们也会出现在主表中,需要将多层级的数据横向展示,A-A1-A11-A111-A111这样,查最后一个没有明细表数据位置
代码实现:
package mainimport ("bufio""fmt""os""strconv""strings""time"_ "github.com/alexbrainman/odbc")func main() {for {chuliYuanExecl()}}func chuliYuanExecl() {for {fmt.Println("开始")start := time.Now()// 这里原本是从数据库查出来的编号,先用数组代替var xspjs = []int{1, 2, 3, 4, 5, 6, 7}for _, value := range xspjs {// 层级var num = 0// 数据库插入值,用于拼接sqlvaulestrlist := []string{}// 数据库字段名,用于拼接sqlkeystrlist := []string{}bomfenjie(value, num, vaulestrlist, keystrlist)}fmt.Println()fmt.Println()elapsed := time.Since(start)fmt.Println("执行完成耗时:", elapsed)fmt.Print("按回车键结束")input := bufio.NewScanner(os.Stdin)input.Scan()if strings.Compare(strings.TrimSpace(input.Text()), "") == 0 {os.Exit(0)}return}}func bomfenjie(item int, num int, vaulestrlist []string, keystrlist []string) {itemcode := item// 字段名不一样所以单独处理if num == 0 {vaulestrlist = append(vaulestrlist, "'"+strconv.Itoa(itemcode)+"'")keystrlist = append(keystrlist, "zjcode")} else {// 这里的字段设置根据数据库的,当时为了这样处理方便设计的数据库vaulestrlist = append(vaulestrlist, "'"+strconv.Itoa(itemcode)+"'")keystrlist = append(keystrlist, "code"+strconv.Itoa(num))}// 这里其实应该用上面的itemcode进行连表查询看看明细表有没有数据// 这里的判断其实应该是判断明细表数据是否是0条if item > 80 {// 如果是0条了说明是最后一条数据,进行拼接sql语句fmt.Println(`INSERT INTO BOM_ALLVALUES_X_QHG (` + strings.Join(keystrlist, ",") + `) VALUES (` + strings.Join(vaulestrlist, ",") + `)`)// 这里要重置,不然的话同级的数据会被拼接在一起vaulestrlist = vaulestrlist[0:0]vaulestrlist = append(vaulestrlist, "'"+strconv.Itoa(item)+"'")keystrlist = append(keystrlist, "zjcode")} else {// 有明细的数据,层级加1num = num + 1// 原本这里是for循环,将查出来的数据再进行递归,这里用加数字代替了item = item + 10// 递归go bomfenjie(item, num, vaulestrlist, keystrlist)}}
结果:
来源地址:https://blog.csdn.net/u013055678/article/details/133793365