2015-10-05 97 views
2

我想下面的SQL語句轉換爲CAML查詢:多內部聯接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 = '[email protected]') 

使用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 

line?我想是這樣的:。 。凡(「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> 

回答

0

就花了相當長的時間今天上午努力工作,這一點和我覺得我有你的解決方案

首先 - 讓我們先從一些通用的僞結構:

ParentTable:ID,標題,ChildTableReference

ChildTable:ID,標題,BabyTableReference

BabyTable:ID,標題

所以,我們有一個包含引用父表。與該引用關聯的表包含對其下的另一個表的引用。

下面是一個簡單實用的例子:

(父)CustomerOrder:ID,標題,客戶ID

(子)顧客:ID,標題,RegionID

(嬰兒)地區:身份證,標題

所以,如果我們想要下面的查詢響應:

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 Type='INNER' ListAlias='Customers'> 
     <Eq> 
      <FieldRef Name='CustomerID' RefType='ID' /> 
      <FieldRef List='Customer' Name='ID' /> 
     </Eq> 
    </Join> 

此先加入是確定的,如果所有我們想要做的是針對客戶的名字,我們就只需要添加我們的預測,我們會好到哪裏去。但是,我們也希望這個客戶的區域。爲此,我們需要第二次加入。第二次連接的技巧是將一個列表引用添加到FIRST FieldRef語句中。確切的行是:FieldRef列表='客戶'名稱='RegionID'RefType ='ID'。請注意,List =屬性指向了Child引用的別名。換句話說,有一個名爲Customers的參考列表,其中包含一個名爲RegionID的列,它是ID的一個reftype。這需要與基於ID屬性上根表Region的稱爲Regions的新別名表相同。

<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> 

這應該讓你一路都有。此外 - 您可以查詢(例如Where子句)您已加入的任何元素,只要字段類型受支持(text,refid,number等)。只要記住,如果您要查詢說,地區的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> 
+0

順便說一句 - CamlJS不支持此嵌套接合,因爲它不請求或處理FieldRef式語句的第一部分的「列表=」屬性。 – skrile