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

Самые сложные SOQL запросы которые вы встречали, писали или видели. И "среднестатистический запрос"

Главное чтобы они были синтаксически и семантически правильными

Хочу кое что протестировать - буду рад если поделитесь.

Так же если не сложно можете привести пример наиболее частых запросов?

Так сказать "Сферический запрос в вакууме". Что-то в духе : 60-80% случаев если вы захотите писать запрос - он будет похож на этот наш "среднестатистический запрос"

Главное чтобы они были синтаксически и семантически правильными :)

Хочу кое что протестировать - буду рад если поделитесь.

Так же если не сложно можете привести пример наиболее частых запросов? 

Так сказать "Сферический запрос в вакууме". Что-то в духе : 60-80% случаев если вы захотите писать запрос - он будет похож на этот наш "среднестатистический запрос" 

Вопрос не в тему, предполагается ли у Вас разработка некого Query Builder для облегчения составления (сложных) запросов?

Вопрос не в тему, предполагается ли у Вас разработка некого Query Builder для облегчения составления (сложных) запросов?

Да без JOIN запросов в Salesforce собственно все запросы становятся легкими. Основной упор ложится на WHERE секцию, ну а тут что может быть сложного? Перечисляй критерии и просто не ошибись. Сколько работаю никогда не сталкивался со сложными запросами. в 99% случаев запросы состоят 2-3 критериев в WHERE + секции ORDER BY. Если сложного могу выделить работу с SOSL, но и то сложно потому что приходится редко работать и каждый раз приходится лезть в документацию чтобы вспомнить.

Да без JOIN запросов в Salesforce собственно все запросы становятся легкими. Основной упор ложится на WHERE секцию, ну а тут что может быть сложного? Перечисляй критерии и просто не ошибись. Сколько работаю никогда не сталкивался со сложными запросами. в 99% случаев запросы состоят 2-3 критериев в WHERE + секции ORDER BY. Если сложного могу выделить работу с SOSL, но и то сложно потому что приходится редко работать и каждый раз приходится лезть в документацию чтобы вспомнить.

(hidden)

[size=6](hidden)[/size]

(hidden)

[size=6](hidden)[/size]

Он не сложный, но дебильный. Наверное я его спъяну написал.

Set<Id> valids = new Set<Id>();
...
List<customObj2__c> list01 = [
SELECT Id, cutomObj1__c
FROM customObj2__c
WHERE customObj1__r.Id IN :valids
ORDER BY Timestamp__c ASC
];

Не, точно не я - я переменную valids не назову.
Так вот эта штука в тесте у меня на почти голом дэв орге выдает:

System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, My_Super_Class: execution of AfterInsert

caused by: System.QueryException: Non-selective query against large object type (more than 100000 rows). Consider an indexed filter or contact salesforce.com about custom indexing.
Even if a field is indexed a filter might still not be selective when:
1. The filter value includes null (for instance binding with a list that contains null)
2. Data skew exists whereby the number of matching rows is very large (for instance, filtering for a particular foreign key value that occurs many times)

Class.My_Super_Class.mySuperMethod: line 42, column 1
Trigger.My_Super_Trigger: line 10, column 1: []

Он не сложный, но дебильный. Наверное я его спъяну написал.
[code]
  Set<Id> valids = new Set<Id>();
...
List<customObj2__c> list01 = [
  SELECT Id, cutomObj1__c
  FROM customObj2__c
  WHERE customObj1__r.Id IN :valids
  ORDER BY Timestamp__c ASC
];
[/code]

Не, точно не я - я переменную valids не назову.
Так вот эта штука в тесте у меня на почти голом дэв орге выдает:

[quote]
System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, My_Super_Class: execution of AfterInsert

caused by: System.QueryException: Non-selective query against large object type (more than 100000 rows). Consider an indexed filter or contact salesforce.com about custom indexing.
Even if a field is indexed a filter might still not be selective when:
1. The filter value includes null (for instance binding with a list that contains null)
2. Data skew exists whereby the number of matching rows is very large (for instance, filtering for a particular foreign key value that occurs many times)

Class.My_Super_Class.mySuperMethod: line 42, column 1
Trigger.My_Super_Trigger: line 10, column 1: [][/quote]

Chiz
Он не сложныq, но дебильный. Наверное я его спъяну написал.
Set<Id> valids = new Set<Id>();
SELECT Id, cutomObj1__c
FROM customObj2__c
WHERE customObj1__r.Id IN :valids
ORDER BY Timestamp__c ASC

Не, точно не я - я переменную valids не назову.
Так вот эта штука в тесте у меня на почти голом дэв орге выдает:

System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, My_Super_Class: execution of AfterInsert

caused by: System.QueryException: Non-selective query against large object type (more than 100000 rows). Consider an indexed filter or contact salesforce.com about custom indexing.
Even if a field is indexed a filter might still not be selective when:
1. The filter value includes null (for instance binding with a list that contains null)
2. Data skew exists whereby the number of matching rows is very large (for instance, filtering for a particular foreign key value that occurs many times)

Class.My_Super_Class.mySuperMethod: line 42, column 1
Trigger.My_Super_Trigger: line 10, column 1: []


Так-то все логично

[quote="Chiz"]Он не сложныq, но дебильный. Наверное я его спъяну написал.
[code]
  
  Set<Id> valids = new Set<Id>();
  SELECT Id, cutomObj1__c
  FROM customObj2__c
    WHERE customObj1__r.Id IN :valids
    ORDER BY Timestamp__c ASC[/code]
Не, точно не я - я переменную valids не назову.
Так вот эта штука в тесте у меня на почти голом дэв орге выдает:

[quote]
System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, My_Super_Class: execution of AfterInsert

caused by: System.QueryException: Non-selective query against large object type (more than 100000 rows). Consider an indexed filter or contact salesforce.com about custom indexing.
Even if a field is indexed a filter might still not be selective when:
1. The filter value includes null (for instance binding with a list that contains null)
2. Data skew exists whereby the number of matching rows is very large (for instance, filtering for a particular foreign key value that occurs many times)

Class.My_Super_Class.mySuperMethod: line 42, column 1
Trigger.My_Super_Trigger: line 10, column 1: [][/quote][/quote]
Так-то все логично

Gres
Так-то все логично

Откуда они взяли
more than 100000 rows
?

[quote="Gres"]Так-то все логично[/quote]
Откуда они взяли [quote]more than 100000 rows[/quote]?

Chiz
Откуда они взяли more than 100000 rows

Я не уверен, но вроди туда входять рекорди с isDeleted = true, возможно в корзине куча рекордов лежит.

[quote="Chiz"]Откуда они взяли more than 100000 rows[/quote]

Я не уверен, но вроди туда входять рекорди с isDeleted = true, возможно в корзине куча рекордов лежит.

Chiz
Gres
Так-то все логично

Откуда они взяли
more than 100000 rows
?

А почему вы используете именно customObj1__r.Id, а не CustomObj1__c? Если данный запрос у вас не в цикле, то рискну предположить что именно в этом скрытом "join'е" вся загвоздка.

[quote="Chiz"][quote="Gres"]Так-то все логично[/quote]
Откуда они взяли [quote]more than 100000 rows[/quote]?[/quote]

А почему вы используете именно customObj1__r.Id, а не CustomObj1__c? Если данный запрос у вас не в цикле, то рискну предположить что именно в этом скрытом "join'е" вся загвоздка.

Alex Tsitsura
Я не уверен, но вроди туда входять рекорди с isDeleted = true, возможно в корзине куча рекордов лежит.

Пустой орг. Предположу, что проблема может быть в
1. The filter value includes null (for instance binding with a list that contains null)

ilya leshchuk
А почему вы используете именно customObj1__r.Id, а не CustomObj1__c? Если данный запрос у вас не в цикле, то рискну предположить что именно в этом скрытом "join'е" вся загвоздка.

Именно в этом. И только на одном орге. На другом - все в порядке. Орги идентичные. Почти. Один без данных. Но код и объекты один в один.
После исправления на __с оно-то тесты прошли. Это было до меня. Так два года висело. Пока именно сегодня не стрельнуло. Дывына.

[quote="Alex Tsitsura"]Я не уверен, но вроди туда входять рекорди с isDeleted = true, возможно в корзине куча рекордов лежит.[/quote]
Пустой орг. Предположу, что проблема может быть в [quote]1. The filter value includes null (for instance binding with a list that contains null) [/quote]
[quote="ilya leshchuk"]А почему вы используете именно customObj1__r.Id, а не CustomObj1__c? Если данный запрос у вас не в цикле, то рискну предположить что именно в этом скрытом "join'е" вся загвоздка.[/quote]
Именно в этом. И только на одном орге. На другом - все в порядке. Орги идентичные. Почти. Один без данных. Но код и объекты один в один.
После исправления на __с оно-то тесты прошли. Это было до меня. Так два года висело. Пока именно сегодня не стрельнуло. Дывына.

Разбавлю тему простой задачкой:

как в запросе получить кол-во только тех записей у которых есть дочерние записи.

сделал, как представлял:

Integer quantity = [SELECT count() from Master__c where MasterParent__c = :rec.id AND ((SELECT сount() from Childs__r)!= 0)];

но нет, не проходит.

сделал чуть сложнее, но все равно если кто знает, отпишитесь

Разбавлю тему простой задачкой:

как в запросе получить кол-во только тех записей у которых есть дочерние записи.

сделал, как представлял:

[code]Integer quantity = [SELECT count() from Master__c where MasterParent__c = :rec.id AND ((SELECT сount() from Childs__r)!= 0)];[/code]

но нет, не проходит.

сделал чуть сложнее, но все равно если кто знает, отпишитесь

А что если пойти другим путем?

[SELECT COUNT_DISTINCT(Master__c) FROM Childs__c WHERE Master__r.MasterParent__c = :rec.id]

ПЫСЫ: сам не пробовал, но по идее все должно работать)

А что если пойти другим путем?
[code][SELECT COUNT_DISTINCT(Master__c) FROM Childs__c WHERE Master__r.MasterParent__c = :rec.id][/code]

ПЫСЫ: сам не пробовал, но по идее все должно работать)

Maxim Elets
[SELECT COUNT_DISTINCT(Master__c) FROM Childs__c WHERE Master__r.MasterParent__c = :rec.id]

если переписать так:

[SELECT COUNT() FROM Childs__c WHERE Master__r.MasterParent__c = :rec.id]

то просто вернет кол-во "правильных" дочерних записей и не дает ответа на задачу "получить кол-во только тех записей у которых есть дочерние записи"

а как написано в оригинале - возвращает List<AggregateResult>, я не проверял, можно ли его использовать для решения данной задачи, кроме того, чем такое решение проще моего, более прямолинейного.

надеюсь получить требуемое число в один SOQL

[quote="Maxim Elets"][SELECT COUNT_DISTINCT(Master__c) FROM Childs__c WHERE Master__r.MasterParent__c = :rec.id][/quote]

если переписать так:
[code][SELECT COUNT() FROM Childs__c WHERE Master__r.MasterParent__c = :rec.id][/code]

то просто вернет кол-во "правильных" дочерних записей и не дает ответа на задачу  "получить кол-во только тех записей у которых есть дочерние записи"

а как написано в оригинале - возвращает List<AggregateResult>, я не проверял, можно ли его использовать для решения данной задачи, кроме того, чем такое решение проще моего, более прямолинейного.

надеюсь получить требуемое число в один SOQL


а зачем переписывать?
cound_distinct вернет количество неповторяющихся мастеров

а зачем переписывать?
cound_distinct вернет количество неповторяющихся мастеров

Maxim Elets
а зачем переписывать?

вот так получилось выдрать из AggregateResult то что нужно:

quantity = (Integer) agrList[0].get('expr0');

Но можно проименовать COUNT_DISTINCT(Master__c) поле...

нужно будет почитать про AggregateResult, а то методом тыка...

спасибо

[quote="Maxim Elets"]а зачем переписывать? [/quote]

вот так получилось выдрать из AggregateResult то что нужно:

[code]quantity = (Integer) agrList[0].get('expr0');[/code]

Но можно проименовать  COUNT_DISTINCT(Master__c) поле...

нужно будет почитать про  AggregateResult, а то методом тыка...

спасибо


Если вам надо получить только кол-со, то +1 за COUNT_DISTINCT, можете подредактировать его добавив

COUNT_DISTINCT(Master__c) quantity
тогда значение сможете вытаскивать чуть более красиво:
quantity = (Integer) argList.get(0).get('quantity');

Если надо сразу получить записи то:

SELECT Name FROM Master__c WHERE Id IN (SELECT Master__c from Child__c WHERE Master__r.MasterParent__c = :rec.Id)

Если вам надо получить только кол-со, то +1 за COUNT_DISTINCT, можете подредактировать его добавив [code]COUNT_DISTINCT(Master__c) quantity[/code] тогда значение сможете вытаскивать чуть более красиво:
[code]quantity = (Integer) argList.get(0).get('quantity');[/code]

Если надо сразу получить записи то:
[code]
SELECT Name FROM Master__c WHERE Id IN (SELECT Master__c from Child__c WHERE Master__r.MasterParent__c = :rec.Id)
[/code]

ilya leshchuk
Если вам надо получить только кол-со, то +1 за COUNT_DISTINCT, можете подредактировать его добавив

COUNT_DISTINCT(Master__c) quantity
тогда значение сможете вытаскивать чуть более красиво:
quantity = (Integer) argList.get(0).get('quantity');
Если надо сразу получить записи то:

SELECT Name FROM Master__c WHERE Id IN (SELECT Master__c from Child__c WHERE Master__r.MasterParent__c = :rec.Id)

всем спасибо.

порой сидишь, придумываешь отличную логику, чтобы решить задачу. Потом понимаешь, что это все можно сделать просто правильно построив SOQL...

Все-таки умение правильно составить SOQL - великое дело.

[quote="ilya leshchuk"]Если вам надо получить только кол-со, то +1 за COUNT_DISTINCT, можете подредактировать его добавив

COUNT_DISTINCT(Master__c) quantity
тогда значение сможете вытаскивать чуть более красиво: 
quantity = (Integer) argList.get(0).get('quantity');
Если надо сразу получить записи то: 

SELECT Name FROM Master__c WHERE Id IN (SELECT Master__c from Child__c WHERE Master__r.MasterParent__c = :rec.Id)[/quote]

всем спасибо.

порой сидишь, придумываешь отличную логику, чтобы решить задачу. Потом понимаешь, что это все можно сделать просто правильно построив SOQL...

Все-таки умение правильно составить SOQL - великое дело.

Den Brown
Все-таки умение правильно составить SOQL - великое дело.

Оо, не представляешь какое великое. Это хорошо что в SOQL еще JOIN нет

[quote="Den Brown"]Все-таки умение правильно составить SOQL - великое дело.[/quote]
Оо, не представляешь какое великое. Это хорошо что в SOQL еще JOIN нет :D 

Dmitry Shnyrev
Den Brown
Все-таки умение правильно составить SOQL - великое дело.

Оо, не представляешь какое великое. Это хорошо что в SOQL еще JOIN нет :D

Как это нет? Они есть просто называются по-другому.

[quote="Dmitry Shnyrev"][quote="Den Brown"]Все-таки умение правильно составить SOQL - великое дело.[/quote]
Оо, не представляешь какое великое. Это хорошо что в SOQL еще JOIN нет :D[/quote]
Как это нет? Они есть просто называются по-другому.

постойте-ка, а ведь можно изменить вот так:

SELECT Count() FROM Master__c WHERE Id IN (SELECT Master__c from Child__c WHERE Master__r.MasterParent__c = :rec.Id)

получиться как мои изначальный вариант, но доведенный до ума.

эти SOQL просто ребусы: интересно работать с ними

постойте-ка, а ведь можно изменить вот так:

[code]SELECT Count() FROM Master__c WHERE Id IN (SELECT Master__c from Child__c WHERE Master__r.MasterParent__c = :rec.Id)[/code]

получиться как мои изначальный вариант, но доведенный до ума.

эти SOQL просто ребусы:  интересно работать с ними

Gres
Как это нет? Они есть просто называются по-другому.

Можно пример чтобы понять про что ты говоришь?

[quote="Gres"]Как это нет? Они есть просто называются по-другому.[/quote]
Можно пример чтобы понять про что ты говоришь?

Dmitry Shnyrev
Можно пример чтобы понять про что ты говоришь?

https://developer.salesforce.com/page/A_Deeper_look_at_SOQL_and_Relationship_Queries_on_Force.com

[quote="Dmitry Shnyrev"]Можно пример чтобы понять про что ты говоришь?[/quote]
https://developer.salesforce.com/page/A_Deeper_look_at_SOQL_and_Relationship_Queries_on_Force.com