描述:
右表按指定的基准列与左表(本表/当前焦点表)关联,并将指定的列拼接到左表上,形成更宽的表。支持左连接、全连接、按位置(行号)连接。
语法:
[<基准列名>] [关联表 <关联表名>] [<关联列名>] [拼接列 {[<拼接列原名>] [命名 <拼接列新名>]}] [方式] [条件 <条件式>]
参数:基准列名
左表(当前表)中用于关联的一个或多个字段,包括#(即位置字段/行号字段)。必要参数,省略参数值时表示参数值是上下文中的焦点列;类型是字段标识或字段标识的集合;参数名必须省略。
例子:
员工表与部门表通过部门编号字段关联
部分NLC代码:拼接 部门编号… //省略号表示这句代码不完整,还不能独立运行
参数:关联表 <关联表名>
用于拼接到左表上的右表。必要参数;类型是表标识;参数名不能省略。
例子:
部分NLC代码:拼接 部门编号; 关联表 部门表…
参数:关联列名
右表用于关联的一个或多个字段,包括#(即位置字段/行号字段)。必要参数,省略参数值时表示参数值是右表的主键或右表中与基准列同名的列;类型是字段标识或字段标识的集合;参数名必须省略。
例子:
部分NLC代码:拼接 部门编号; 关联表 部门表; 部门编号… //本例的关联列名与基准列名同名,所以可省略。
参数:拼接列
建立关联关系后,需要拼到左表上的右表中的所有列。必要参数;含有2个子参数,分别是拼接列原名、命名 <拼接列新名>],这两个参数用一次,表示把右表中的一个列拼接到左表,如果需要拼接多个列,就需要用多次。参数拼接列的参数名不能省略。
子参数:拼接列原名
右表里需要拼接到左表上的单列。必要参数;类型是单个字段标识;参数名必须省略。注意,如果用户指令要求拼接所有的列,则应当从上下文环境中的引用表中取出右表所有的字段名,依次作为本参数的值。
子参数:命名 <拼接列新名>
参数拼接列原名改名后的新列名。非必要参数,也就是说可以不改名;类型是单个字段标识;参数名不能省略。
例子:
员工表与部门表通过部门编号字段关联,把部门表的字段部门名称、办公地址拼接到左表上。其中,原字段名办公地址改成新字段名地址。
NLC:拼接 部门编号; 关联表 部门表; 部门编号;拼接列 部门名称, 办公地址 命名 地址 //这段是完整代码,没有省略号。
参数:方式
关联时的连接方式。必要参数,无此参数时表示参数值是左连接,比如上一个例子;枚举类型;参数名必须省略。有4个枚举值:左连接、内连接、全连接、对位。
左连接、内连接、全连接:这3个枚举值按常识理解,类似SQL的三种关联方式。
例子:
不用默认的左关联,而是用全关联关联员工表和部门表
NLC:拼接 部门编号; 关联表 部门表; 部门编号;拼接列 部门名称, 办公地址 命名 地址; 全关联
对位:表示按位置或行号#进行关联,即行号相同的记录关联在一起。用对位的方式时,基准列名和关联列名都是#,可以省略。
参数:条件 <条件式>
本参数用于对关联后的结果进行过滤,通常含有基准表(左表)的字段和右表的字段,其中基准表的字段必须用@后缀,非基准表的字段一定没有@后缀,比如NLC代码片段:订单日期>注册日期@。这里字段订单日期是右表字段,而字段注册日期是左表字段。本参数的作用类似于SQL中"join on… where…"中的where条件,比如SQL代码:"select 左表.* from 左表 inner join 右表 on 左表.id=右表.id where 右表.订单日期>左表.注册日期",本参数类似SQL中的"右表.订单日期>左表.注册日期"。
非必要参数;条件式;参数名不能省略。注意,有本参数时仅支持内连接和左连接,不支持全连接。
例子:
员工表与部门表通过部门编号字段关联,拼接上部门表的部门经理、部门地址字段,按条件式(员工工资@>=5000 且 (["销售一部","销售二部","产品部"] 包含 部门名称))进行过滤。
NLC:拼接 部门编号; 关联表 部门表; 部门编号; 拼接列 部门经理 部门地址; 内关联; 条件 (员工工资@>=5000 且 (["销售一部","销售二部","产品部"] 包含 部门名称))
员工表与部门表关联,拼接上部门表的部门经理、部门地址字段,按条件式(员工工资@>=5000 且 (["销售一部","销售二部","产品部"] 包含 部门名称))进行过滤。
NLC:拼接 关联表 部门表; 拼接列 部门经理 部门地址; 内关联; 条件 (员工工资@>=5000 且 (["销售一部","销售二部","产品部"] 包含 部门名称))
特殊规则:你要把区间关联转换为参数条件 <条件式>。这个规则的意思是,用户指令中可能会出现左表某字段在右表某两个字段区间内的描述,比如"左表的价格@字段在右表的预算1和预算2之间",此时应当把这句描述转换成等价的区间条件式"价格@>=预算1 且 价格@<预算2",并将该条件式加入到参数条件 <条件式>中,没有明确开闭区间描述时用左开右开区间,。
例子:
员工表与部门表通过部门编号字段关联,拼接上部门表的部门经理、部门地址字段,员工工资@在工资下限和工资上限之间,按条件式( ["销售一部","销售二部","产品部"] 包含 部门名称)进行过滤。
NLC:拼接 部门编号; 关联表 部门表; 部门编号; 拼接列 部门经理 部门地址; 内关联; 条件 ((员工工资@>=工资下限 且 员工工资<=工资上限) 且 (["销售一部","销售二部","产品部"] 包含 部门名称))