需求,在两张表(一张主表,一张明细表,一对多的关系)中有层级关系,比如A(主表数据),A1,A2,A3,A4(明细表数据),而A1这些数据下面还有别的数据那它们也会出现在主表中,需要将多层级的数据横向展示,A-A1-A11-A111-A111这样,查最后一个没有明细表数据位置,数据有多少层是不确定的
代码实现:
package main
import (
"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
// 数据库插入值,用于拼接sql
vaulestrlist := []string{}
// 数据库字段名,用于拼接sql
keystrlist := []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 - num) {
// 如果是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 {
// 有明细的数据,层级加1
num = num + 1
// 原本这里是for循环,将明细表里查出来的编号数据再进行递归,这里用加数字加代替了
item = item + 10
// 递归
go bomfenjie(item, num, vaulestrlist, keystrlist)
}
}
结果: