首页 新闻 会员 周边 捐助

left join 内置源码或这运行原理

0
悬赏园豆:5 [待解决问题]

1.今天突然想了解下left join 数据结构 中的运行变化,它内部指针是怎么进行 对比数据的?或者有大佬给下资源怎么去查看源码也可以?

马蹄烧饼的主页 马蹄烧饼 | 初学一级 | 园豆:197
提问于:2022-09-06 16:24
< >
分享
所有回答(3)
0

伪代码如下:

            var result = new Result();

            for (int i = 0; i < leftTable.Count; i++)
            {
                var leftRow = leftTable[i];
                if (leftRow.LeftJoinField != null)
                {
                    var rightRow = FindRowFromRightTable(leftRow.LeftJoinField, rightTableJoinField);
                    var item = new Item();
                    item.Add(leftRow);
                    if(rightRow != null)
                    {
                        item.Add(rightRow);
                    }
                    result.Add(item);
                }
            }

            return result;
会长 | 园豆:12463 (专家六级) | 2022-09-06 17:37
0

文档:https://www.cnblogs.com/hider/p/11616518.html
其它:(https://zhuanlan.zhihu.com/p/85856388)
mysql采用嵌套循环的方式处理left join。
SELECT * FROM LT LEFT JOIN RT ON P1(LT, RT)) WHERE P2(LT, RT)
其中P1是on过滤条件, 缺失则认为是TRUE, P2是where过滤条件, 缺失也认为是TRUE, 该语句的执行逻辑可以描述为:
FOR each row lt in LT
{ // 遍历左表的每一行
BOOL b = FALSE;
FOR each row rt in RT such that P1(lt, rt)
{ // 遍历右表每一行,找到满足join条件的行
IF P2(lt, rt)
{ //满足 where 过滤条件
t: = lt || rt; //合并行,输出该行
}
b = TRUE; // lt在RT中有对应的行
}
IF(!b)
{ // 遍历完RT,发现lt在RT中没有有对应的行,则尝试用null补一行
IF P2(lt, NULL)
{ // 补上null后满足 where 过滤条件
t: = lt || NULL; // 输出lt和null补上的行
}
}
}

人间春风意 | 园豆:2784 (老鸟四级) | 2022-09-09 09:47
0

直接把linq的函数代码看一下就清楚了,最多不同产品实现细节不一样而已。

花飘水流兮 | 园豆:13617 (专家六级) | 2022-09-11 01:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册