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

Semi join sub-selects are not allowed with the 'OR' operator

Здравствуйте!

Столкнулся с такой задачей:

Есть объект Account, в котором два поля-лукапи Contact1 и Contact2, эти поля могут быть не заполнены. Нужно используя поля Contact1 и Contact2 вытянуть определенное количество контактов(пусть будет 10), это нужно для того чтобы сделать пагинацыю на странице. (Вариант чтобы вытянуть акаунты и потом из них значения Contact1 и Contact2 запихнуть в сет не предлагать).

Думал написать что-то типа:

SELECT *
FROM Contact
WHERE Id IN (
SELECT Contact_1 FROM Account
) OR Id IN (
SELECT Contact_2 FROM Account
)
ORDER BY Id
LIMIT 10
OFFSET 50

Но такой запрос не работает, точнее видает "Semi join sub-selects are not allowed with the 'OR' operator".

Здравствуйте!

Столкнулся с такой задачей:

Есть объект Account, в котором два поля-лукапи Contact1 и Contact2, эти поля могут быть не заполнены. Нужно используя поля Contact1 и Contact2 вытянуть определенное количество контактов(пусть будет 10), это нужно для того чтобы сделать пагинацыю на странице. (Вариант чтобы вытянуть акаунты и потом из них значения Contact1 и Contact2 запихнуть в сет не предлагать).

Думал написать что-то типа:
[code]
SELECT *
FROM Contact
WHERE Id IN (
  SELECT Contact_1 FROM Account
) OR Id IN (
  SELECT Contact_2 FROM Account
)
ORDER BY Id
LIMIT 10
OFFSET 50
[/code] 

Но такой запрос не работает, точнее видает "Semi join sub-selects are not allowed with the 'OR' operator".

Ты не думал над таким моментом, что можно вытянуть по запросу в лист и написать так NOT IN: contactList1 и т.д. ?
Обязательно для чтения:
https://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_SOQL_variables.htm
http://www.salesforce.com/us/developer/docs/officetoolkit/Content/sforce_api_calls_soql_select.htm

Ты не думал над таким моментом, что можно вытянуть по запросу в лист и написать так NOT IN: contactList1 и т.д. ?
Обязательно для чтения:
https://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_SOQL_variables.htm
http://www.salesforce.com/us/developer/docs/officetoolkit/Content/sforce_api_calls_soql_select.htm 

Eugene Konstantinof
Ты не думал над таким моментом, что можно вытянуть по запросу в лист и написать так NOT IN: contactList1 и т.д. ?

думал
Alex Tsitsura
Вариант чтобы вытянуть акаунты и потом из них значения Contact1 и Contact2 запихнуть в сет не предлагать

Проблема в том, что рекордов реально много. Сейчас логика такая, что когда клиент переключает страницу, то делается новый запрос в базу(чтобы витягнуть рекорды которие должны отобразится на конкретной странице), и если сначала выбрать все рекорды и запомнить айдишки контактов в сете, то такая конструкция очень долго работает. У меня это примерно 30-40 секунд(согласитесь, это очень долго, когда клиент хочет просто просмотреть следующую страницу записей.) Если выборку контактов занести в конструктор, то соответственно страница очень долго грузится.

Как мне известно есть клиент которому нужно работать с 10000+ рекордов. Боюсь что можно и HeapExceeds схапать:(

[quote="Eugene Konstantinof"]Ты не думал над таким моментом, что можно вытянуть по запросу в лист и написать так NOT IN: contactList1 и т.д. ? [/quote]
думал
[quote="Alex Tsitsura"]Вариант чтобы вытянуть акаунты и потом из них значения Contact1 и Contact2 запихнуть в сет не предлагать[/quote]

Проблема в том, что рекордов реально много. Сейчас логика такая, что когда клиент переключает страницу, то делается новый запрос в базу(чтобы витягнуть рекорды которие должны отобразится на конкретной странице), и если сначала выбрать все рекорды и запомнить айдишки контактов в сете, то такая конструкция очень долго работает. У меня это примерно 30-40 секунд(согласитесь, это очень долго, когда клиент хочет просто просмотреть следующую страницу записей.) Если выборку контактов занести в конструктор, то соответственно страница очень долго грузится. 

Как мне известно есть клиент которому нужно работать с 10000+ рекордов. Боюсь что можно и HeapExceeds схапать:(