Регистрация  |  Вход

Трабля с запросом

Такая ситуация, надо сделать выборку одновременно из 3х обьектов.
Примерная схема: Объект А(поля: Id), Объект B(поля: Id, A.id, C.id) , Объект С(поля: Id)
То есть Объект Б является связующим звеном.
В MySQL я бы сделал так:
SELECT pc.id, dc.Affected_Task__c, dc.Dependency_Type__c, dc.Offset_Days__c, pt.id, pt.Completion_Status__c, pt.Completion_Date__c
FROM Project_Task__c AS pc
INNER JOIN Dependency__c AS dc ON dc.Critical_Task__c = pc.id
INNER Project_Task__c AS pt ON pt.id = dc.Affected_Task__c
WHERE pc.id = 'a09c0000002GXBq'
Но в SF данная конструкция работать не хочет(
Ошибка: expecting right square bracket, found 'INNER' at line 17 column 26
Как правильно составить данный запрос?

Такая ситуация, надо сделать выборку одновременно из 3х обьектов. 
Примерная схема: Объект А(поля: Id), Объект B(поля: Id, A.id, C.id) , Объект С(поля: Id)
То есть  Объект Б является связующим звеном.
В MySQL  я бы сделал так: 
SELECT pc.id, dc.Affected_Task__c, dc.Dependency_Type__c, dc.Offset_Days__c, pt.id, pt.Completion_Status__c, pt.Completion_Date__c
                          FROM Project_Task__c AS pc
                          INNER JOIN Dependency__c AS dc ON dc.Critical_Task__c = pc.id
                          INNER Project_Task__c AS pt ON pt.id = dc.Affected_Task__c
                          WHERE pc.id = 'a09c0000002GXBq'
Но в SF данная конструкция работать не хочет(
Ошибка:  expecting right square bracket, found 'INNER' at line 17 column 26
Как правильно составить данный запрос?

В Salesforce используется SOQL и он отличается от SQL несмотря на свою внешнюю похожесть.
Join в нем нет, поэтому придется немного сломать свое привычное представление о работе с базой данных.

Вот общее направление куда надо думать:

чтобы обратиться к родителям плоть до 5 уровней вверх надо использовать some_field__r.some_child__r.some_child__r.some_child_field__c
чтобы получить детей, то можно использовать вложенные SOQL.

Примерная схема: Объект А(поля: Id), Объект B(поля: Id, A.id, C.id) , Объект С(поля: Id)
То есть Объект Б является связующим звеном.

Я так понял что это связь многие-ко-многим между A и С (через B)

Опиши то что ты хочешь выбрать словами, и я попробую перевести это на язык SOQL.

В Salesforce используется SOQL и он отличается от SQL несмотря на свою внешнюю похожесть.
Join в нем нет, поэтому придется немного сломать свое привычное представление о работе с базой данных.

Вот общее направление куда надо думать:

чтобы обратиться к родителям плоть до 5 уровней вверх надо использовать some_field__r.some_child__r.some_child__r.some_child_field__c
чтобы получить детей, то можно использовать вложенные SOQL.

[quote]Примерная схема: Объект А(поля: Id), Объект B(поля: Id, A.id, C.id) , Объект С(поля: Id)
То есть Объект Б является связующим звеном.[/quote]
Я так понял что это связь многие-ко-многим между A  и  С (через B)

Опиши то что ты хочешь выбрать словами, и я попробую перевести это на язык SOQL.

в SOQL все организовано намного проще чем в традиционой SQL.

иногда мне кажется, что это все вовсе не реляционая БД, а объектная....

посмотри сюда:

http://www.salesforce.com/us/developer/docs/apex_workbook/index.htm

Chapter2 - Tutorial 8 - Lesson 3: Traversing and Querying sObject Relationships

Traversing relationship - одно удовольствие.

Надеюсь эта инфа поможет тебе разобраться в ситуации.

в SOQL все организовано намного проще чем в традиционой SQL.

иногда мне кажется, что это все вовсе не реляционая БД, а объектная....

посмотри сюда:

[url]http://www.salesforce.com/us/developer/docs/apex_workbook/index.htm[/url]

Chapter2 - Tutorial 8 - Lesson 3: Traversing and Querying sObject Relationships

Traversing relationship - одно удовольствие.

Надеюсь эта инфа поможет тебе разобраться в ситуации.

Den Brown, спс.
Dmitry Shnyrev скинул мне решение:
LIst<Project_Task__c> ptBList = [SELECT Id FROM Project_Task__c WHERE Id in (SELECT Affected_Task__c FROM Dependency__c WHERE Dependency_Type__c = 'Finish to Finnish' AND Critical_Task__c = :ptA_Id) AND (Project_Task__c.Completion_Status__c = null OR Project_Task__c.Completion_Status__c = 'Planned')];
Примерно так.
Пришлось сделать несколько иначе, но подход я понял. Спс!
Сделал так:
Select Affected_Task__c from Dependency__c where (Critical_Task__r.Completion_Date__c != null or Critical_Task__r.Completion_Status__c = 'Planned') and Dependency_Type__c = 'Finish to Finnish' and Critical_Task__c = 'a09c0000002GXBq'
В итоге спимок ИДшников Project_Task__c

Den Brown, спс.
Dmitry Shnyrev скинул мне решение:
LIst<Project_Task__c> ptBList = [SELECT Id FROM Project_Task__c WHERE Id in (SELECT Affected_Task__c FROM Dependency__c WHERE Dependency_Type__c = 'Finish to Finnish' AND Critical_Task__c = :ptA_Id) AND (Project_Task__c.Completion_Status__c = null OR Project_Task__c.Completion_Status__c = 'Planned')];
Примерно так.
Пришлось сделать несколько иначе, но подход я понял. Спс!
Сделал так:
Select Affected_Task__c from Dependency__c where (Critical_Task__r.Completion_Date__c != null or Critical_Task__r.Completion_Status__c = 'Planned') and Dependency_Type__c = 'Finish to Finnish' and Critical_Task__c = 'a09c0000002GXBq'
В итоге спимок ИДшников Project_Task__c