Самые сложные 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, но и то сложно потому что приходится редко работать и каждый раз приходится лезть в документацию чтобы вспомнить.
Он не сложный, но дебильный. Наверное я его спъяну написал.
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 не назову. Так вот эта штука в тесте у меня на почти голом дэв орге выдает:
Он не сложный, но дебильный. Наверное я его спъяну написал.
[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]
[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]
Так-то все логично
[quote="Chiz"]Откуда они взяли more than 100000 rows[/quote]
Я не уверен, но вроди туда входять рекорди с isDeleted = true, возможно в корзине куча рекордов лежит.
Так-то все логично
Откуда они взяли
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'е" вся загвоздка.
Я не уверен, но вроди туда входять рекорди с isDeleted = true, возможно в корзине куча рекордов лежит.
Пустой орг. Предположу, что проблема может быть в
1. The filter value includes null (for instance binding with a list that contains null)
А почему вы используете именно 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]
ПЫСЫ: сам не пробовал, но по идее все должно работать)
[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>, я не проверял, можно ли его использовать для решения данной задачи, кроме того, чем такое решение проще моего, более прямолинейного.
[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 вернет количество неповторяющихся мастеров
[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
тогда значение сможете вытаскивать чуть более красиво:
Если вам надо получить только кол-со, то +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]
Если вам надо получить только кол-со, то +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...
[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 - великое дело.
[quote="Den Brown"]Все-таки умение правильно составить SOQL - великое дело.[/quote]
Оо, не представляешь какое великое. Это хорошо что в 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)
получиться как мои изначальный вариант, но доведенный до ума.
постойте-ка, а ведь можно изменить вот так:
[code]SELECT Count() FROM Master__c WHERE Id IN (SELECT Master__c from Child__c WHERE Master__r.MasterParent__c = :rec.Id)[/code]
получиться как мои изначальный вариант, но доведенный до ума.
эти SOQL просто ребусы: интересно работать с ними
Как это нет? Они есть просто называются по-другому.
[quote="Dmitry Shnyrev"]Можно пример чтобы понять про что ты говоришь?[/quote]
https://developer.salesforce.com/page/A_Deeper_look_at_SOQL_and_Relationship_Queries_on_Force.com