伪代码如下:
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;
文档: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补上的行
}
}
}
直接把linq的函数代码看一下就清楚了,最多不同产品实现细节不一样而已。