Sql 多内部联接CAML查询
我正在尝试将以下SQL语句转换为CAML查询:Sql 多内部联接CAML查询,sql,sharepoint,caml,Sql,Sharepoint,Caml,我正在尝试将以下SQL语句转换为CAML查询: SELECT t.Id, t.Name, t.CustomerId FROM Ticket AS t INNER JOIN Customer AS c1 ON t.CustomerEMail = c1.EMail INNER JOIN Customer AS
SELECT t.Id, t.Name, t.CustomerId
FROM Ticket AS t
INNER JOIN
Customer AS c1 ON t.CustomerEMail = c1.EMail
INNER JOIN
Customer AS c2 ON c1.CompanyNo = c2.CompanyNo
WHERE (c2.Email = 'client1@co1.com')
使用CAMLJS,我做到了这一点:(CompanyNo相当于Nav_CustomerNo)
但我不知道如何从这里开始。我如何转换
Customer AS c1 ON t.CustomerEMail = c1.EMail
线路?我的想法是:
.Where(“c1Email”).EqualTo(
以下是等效的CAML:
<View>
<ViewFields>
<FieldRef Name="Title" />
<FieldRef Name="Ticket_MainBody" />
<FieldRef Name="Ticket_SupportID" />
<FieldRef Name="ClientLookup" />
<FieldRef Name="IsPrivateTicket" />
<FieldRef Name="Ticket_IsFAQ" />
</ViewFields>
<Joins>
<Join Type="INNER" ListAlias="c1">
<Eq>
<FieldRef Name="ClientLookup" RefType="ID" />
<FieldRef Name="ID" List="c1" />
</Eq>
</Join>
<Join Type="INNER" ListAlias="c2">
<Eq>
<FieldRef Name="ClientLookup" RefType="ID" />
<FieldRef Name="ID" List="c2" />
</Eq>
</Join>
</Joins>
<ProjectedFields>
<Field ShowField="EMail" Type="Lookup" Name="c1Email" List="c1" />
<Field ShowField="Nav_CustomerNo" Type="Lookup" Name="c2CompanyNo" List="c2" />
</ProjectedFields>
<Query>
<Where />
</Query>
</View>
今天早上我花了很长时间试图解决这个问题,我想我有一个解决方案给你 首先,让我们从一些通用的伪结构开始: 父表:Id、标题、子表引用 ChildTable:Id、标题、BabyTableReference 婴儿表:Id,标题 因此,我们有一个包含引用的父表。绑定到该引用的表包含对该引用下另一个表的引用 下面是一个简单的实际例子: (父)CustomerOrder:Id、标题、CustomerID (子)客户:Id、职务、地区Id (婴儿)地区:Id,头衔 那么,如果我们想要以下查询响应呢: 客户订单Id、客户订单标题、客户标题、地区标题 XML的第一部分很简单:
<ViewFields>
<FieldRef Name='ID' />
<FieldRef Name='Title' />
<FieldRef Name='Customer_Title' />
<FieldRef Name='Region_Title' />
</ViewFields>
但是我们如何把表缝合在一起呢?我们使用连接
第一个连接非常简单:
<Join Type='INNER' ListAlias='Customers'>
<Eq>
<FieldRef Name='CustomerID' RefType='ID' />
<FieldRef List='Customer' Name='ID' />
</Eq>
</Join>
第一次连接是可以的,如果我们只想查看客户名称,我们只需添加投影即可。但是,我们还需要此客户的区域。为此,我们需要第二次连接。第二次连接的诀窍是向第一个FieldRef语句添加列表引用。确切的行是:FieldRef List='Customers'Name='RegionID'RefType='ID'。请注意,List=属性指向子引用的别名。换句话说,有一个名为Customers的引用列表,其中包含一个名为RegionID的列,该列是ID的RefType。该列需要与我们新的别名表Regions相等,该别名表基于根表ID属性上的区域
<Join Type='INNER' ListAlias='Regions'>
<Eq>
<FieldRef List='Customers' Name='RegionID' RefType='ID' />
<FieldRef List='Regions' Name='ID' />
</Eq>
</Join>
我们现在差不多到家了。此时,我们需要创建投影字段,以显示Region.Title和Customer.Title属性
<ProjectedFields>
<Field ShowField='Title' Type='Lookup' Name='Customer_Title' List='Customers' />
<Field ShowField='Title' Type='Lookup' Name='Region_Title' List='Regions' />
</ProjectedFields>
将所有这些放在一起,您的CAML查询将是:
//Completed query
<View>
<ViewFields>
<FieldRef Name='ID' />
<FieldRef Name='Title' />
<FieldRef Name='Customer_Title' />
<FieldRef Name='Region_Title' />
</ViewFields>
<Joins>
<Join Type='INNER' ListAlias='Customers'>
<Eq>
<FieldRef Name='CustomerID' RefType='ID' />
<FieldRef List='Customer' Name='ID' />
</Eq>
</Join>
<Join Type='INNER' ListAlias='Regions'>
<Eq>
<FieldRef List='Customers' Name='RegionID' RefType='ID' />
<FieldRef List='Regions' Name='ID' />
</Eq>
</Join>
</Joins>
<ProjectedFields>
<Field ShowField='Title' Type='Lookup' Name='Customer_Title' List='Customers' />
<Field ShowField='Title' Type='Lookup' Name='Region_Title' List='Regions' />
</ProjectedFields>
<Query />
</View>
//已完成查询
这应该可以让你一直做到这一点。此外,如果支持字段类型(文本、refid、数字等),你可以查询(例如Where子句)你加入的任何元素。只要记住,如果你要查询,比如说,区域的ID,你需要将ID添加到你的ProjectedFields中
// completed query with WHERE clause filtering by BABY table ID.
<View>
<ViewFields>
<FieldRef Name='ID' />
<FieldRef Name='Title' />
<FieldRef Name='Customer_Title' />
<FieldRef Name='Region_Title' />
</ViewFields>
<Joins>
<Join Type='INNER' ListAlias='Customers'>
<Eq>
<FieldRef Name='CustomerID' RefType='ID' />
<FieldRef List='Customer' Name='ID' />
</Eq>
</Join>
<Join Type='INNER' ListAlias='Regions'>
<Eq>
<FieldRef List='Customers' Name='RegionID' RefType='ID' />
<FieldRef List='Regions' Name='ID' />
</Eq>
</Join>
</Joins>
<ProjectedFields>
<Field ShowField='Title' Type='Lookup' Name='Customer_Title' List='Customers' />
<Field ShowField='ID' Type='Lookup' Name='Region_ID' List='Regions' />
<Field ShowField='Title' Type='Lookup' Name='Region_Title' List='Regions' />
</ProjectedFields>
<Query>
<Where>
<Eq>
<FieldRef Name='Region_ID' LookupId='True' />
<Value Type='Integer'>1</Value>
</Eq>
</Where>
</Query>
</View>
//已完成查询,其中WHERE子句按子表ID筛选。
1.
BTW-CamlJS不支持这种嵌套连接,因为它不请求或处理FieldRef Eq语句第一部分的“List=”属性。
// completed query with WHERE clause filtering by BABY table ID.
<View>
<ViewFields>
<FieldRef Name='ID' />
<FieldRef Name='Title' />
<FieldRef Name='Customer_Title' />
<FieldRef Name='Region_Title' />
</ViewFields>
<Joins>
<Join Type='INNER' ListAlias='Customers'>
<Eq>
<FieldRef Name='CustomerID' RefType='ID' />
<FieldRef List='Customer' Name='ID' />
</Eq>
</Join>
<Join Type='INNER' ListAlias='Regions'>
<Eq>
<FieldRef List='Customers' Name='RegionID' RefType='ID' />
<FieldRef List='Regions' Name='ID' />
</Eq>
</Join>
</Joins>
<ProjectedFields>
<Field ShowField='Title' Type='Lookup' Name='Customer_Title' List='Customers' />
<Field ShowField='ID' Type='Lookup' Name='Region_ID' List='Regions' />
<Field ShowField='Title' Type='Lookup' Name='Region_Title' List='Regions' />
</ProjectedFields>
<Query>
<Where>
<Eq>
<FieldRef Name='Region_ID' LookupId='True' />
<Value Type='Integer'>1</Value>
</Eq>
</Where>
</Query>
</View>