【问题标题】:Multiple Inner Joins CAML query多个内连接 CAML 查询
【发布时间】:2015-10-05 11:13:49
【问题描述】:

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

var query = new CamlBuilder()
.View(["Title", ...])
.InnerJoin("ClientLookup", "c1")
.Select("EMail", "c1Email")
.InnerJoin("ClientLookup", "c2")
.Select("Nav_CustomerNo", "c2CompanyNo")
.Query()
.Where()
.All()
.ToString()

但我不确定如何从这里开始。如何转换

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>

【问题讨论】:

    标签: sql sharepoint caml


    【解决方案1】:

    今天早上花了很长时间试图解决这个问题,我想我有一个适合你的解决方案。

    首先 - 让我们从一些通用的伪结构开始:

    父表:ID、标题、子表参考

    ChildTable:Id、Title、BabyTableReference

    BabyTable:ID、标题

    所以,我们有一个包含引用的父表。与该引用关联的表包含对该引用下的另一个表的引用。

    这是一个简单的实际例子:

    (父)CustomerOrder:Id、Title、CustomerID

    (子)客户:Id、Title、RegionID

    (婴儿)地区:ID,标题

    那么,如果我们想要以下查询响应怎么办:

    CustomerOrder_Id、CustomerOrder_Title、Customer_Title、Region_Title

    XML 的第一部分很简单:

        <ViewFields>
            <FieldRef Name='ID' />
            <FieldRef Name='Title' />
            <FieldRef Name='Customer_Title' />
            <FieldRef Name='Region_Title' />
        </ViewFields>        
    

    但是我们如何将表格拼接在一起呢?我们使用连接。

    第一个Join很简单:

        <Join Type='INNER' ListAlias='Customers'>
            <Eq>
                <FieldRef Name='CustomerID' RefType='ID' />
                <FieldRef List='Customer' Name='ID' />
            </Eq>
        </Join>
    

    第一次加入没问题,如果我们只想查看客户名称,我们只需要添加我们的 Projection 就可以了。但是,我们也想要这个客户的区域。为此,我们需要第二次加入。第二个连接的技巧是向 FIRST FieldRef 语句添加列表引用。确切的行是: FieldRef List='Customers' Name='RegionID' RefType='ID' 。请注意,List= 属性指向 Child 引用的别名。换句话说,有一个名为 Customers 的引用列表,其中包含一个名为 RegionID 的列,它是 ID 的引用类型。这需要等于我们基于 ID 属性上的根表 Region 的名为 Regions 的新别名表。

      <Join Type='INNER' ListAlias='Regions'>
          <Eq>
              <FieldRef List='Customers' Name='RegionID' RefType='ID' />
              <FieldRef List='Regions' Name='ID' />
          </Eq>
      </Join>
    

    我们现在快到家了。此时我们需要创建 Projected Fields 来吐出 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>
    

    【讨论】:

    • BTW - CamlJS 不支持这种嵌套连接,因为它不请求或处理 FieldRef Eq 语句第一部分的“List=”属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2017-09-17
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多