Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多内部联接CAML查询_Sql_Sharepoint_Caml - Fatal编程技术网

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

我正在尝试将以下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 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>