2015-10-05 4 views
2

Я пытаюсь преобразовать следующий SQL заявление в CAML запроса:Multiple внутренние соединения 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 

линия? Я имею в виду что-то вроде:. .гда («c1Email») EqualTo (??

Вот эквивалент КАМЛ:

<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, название, CustomerID

(ребенок) Заказчик: Id, название, 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 Type='INNER' ListAlias='Customers'> 
     <Eq> 
      <FieldRef Name='CustomerID' RefType='ID' /> 
      <FieldRef List='Customer' Name='ID' /> 
     </Eq> 
    </Join> 

Это первое соединение является нормально, и если все, что мы хотели сделать, это посмотреть имя клиента, мы просто должны добавить наш прогноз, и мы бы хорошо идти , Но нам также нужен регион этого клиента. Для этого нам нужно второе соединение. Трюк ко второму соединению заключается в том, чтобы добавить ссылку на список для инструкции FIRST FieldRef. Точная строка: FieldRef List = 'Customer' Name = 'RegionID' RefType = 'ID'. Обратите внимание, что атрибут List = указывает на псевдоним ссылки Child. Другими словами, существует список ссылок, называемый Клиентами, который содержит столбец RegionID, который является повторным идентификатором. Это должно быть равно нашей новой таблице с псевдонимом «Регионы», основанной на корневой таблице «Регион» в атрибуте «Идентификатор».

<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) для любого элемента, к которому вы присоединились, при условии, что поддерживается тип поля (текст, refid, number и т. Д.). Просто помните, что если вы собираетесь запросить, например, идентификатор региона, вам нужно будет добавить идентификатор к вашим 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

BTW - CamlJS не поддерживает это вложенное соединение, так как он не запрашивает или не обрабатывает атрибут «List =» первой части инструкции FieldRef Eq. – skrile

 Смежные вопросы

  • Нет связанных вопросов^_^