31.05.2007, 09:35 | #1 |
Участник
|
Можно-ли перевести запрос с человечъего на Аксаптовский ?
Собственно вот такой запрос
X++: select sum(LedgerJournalTrans.AmountCurCredit) from LedgerJournalTrans, SalesPaymentJournal where SalesPaymentJournal.JournalNum = LedgerJournalTrans.JournalNum and rtrim(ltrim(SalesPaymentJournal.SalesId)) = 'КЛ7-0040682' Если сделать так X++: select sum(AmountCurCredit) from LedgerJournalTrans join SalesPaymentJournal where SalesPaymentJournal.JournalNum == LedgerJournalTrans.JournalNum && SalesPaymentJournal.SalesId == this.SalesId; |
|
31.05.2007, 09:50 | #2 |
Moderator
|
Если вопрос только в том, что запрос возвращает все поля из 2-й таблицы, то напишите не join SalesPaymentJournal, а exists join SalesPaymentJournal.
__________________
Андрей. |
|
|
За это сообщение автора поблагодарили: egorych (1). |
31.05.2007, 09:53 | #3 |
Участник
|
или join max(recID) from SalesPaymentJournal
|
|
31.05.2007, 10:22 | #4 |
Участник
|
exists join помог !
|
|
31.05.2007, 10:29 | #5 |
Участник
|
Не знаю, обоснованно это или нет, но я не очень доверяю exists join.
Возможно это связано с неприятными воспоминаниями того, как эта конструкция отправлялась на сервер БД раньше (как подзапрос), что, естественно, отражалось на быстродействии. Сейчас, когда пишу запросы, использую или join TableId или join maxOf(recId), как указал Максим постом выше. Хотя, может это уже и не оправданно. |
|
31.05.2007, 17:52 | #6 |
Участник
|
Конкретно в этом запросе теоретически и не нужен. Но как BestPractice думаю стоит писать
|
|
01.06.2007, 19:05 | #7 |
Участник
|
Экономно так :
X++: select sum(AmountCurCredit) from LedgerJournalTrans join [COLOR="Red"]TableID from[/COLOR] SalesPaymentJournal where SalesPaymentJournal.JournalNum == LedgerJournalTrans.JournalNum && SalesPaymentJournal.SalesId == this.SalesId; |
|
01.06.2007, 23:56 | #8 |
Участник
|
Цитата:
|
|
02.06.2007, 12:01 | #9 |
Участник
|
Конечно нету.
Я имел ввиду немного другое: Что стоит писать join maxOf всегда (это не обязательно должен быть именно maxOf. можно использовать и minOf к примеру) во избежание ошибок в запросах (когда в запросе используется группировка, а из подчиненной таблицы не вибираются никакие агрегированные поля - получаем ошибку времени выполнения, которая об этом нам сообщает). Этот BestPractice неписанный, сродни тому, который недавно обсуждался - про использование энумераторов вместо итераторов. |
|
02.06.2007, 14:36 | #10 |
Участник
|
Если есть группировка, то выбор "к-н поля" не сработает - будет ошибка, что поле из таблицы не используется в агрегирующей функции и в группировке.
самый простой способ - применить агрегатную функцию к какому-то полю. |
|
02.06.2007, 17:38 | #11 |
Участник
|
Да часто. Когда забывал и не делал maxOf или группировку по каким-то полям в подниченной таблице
|
|
02.06.2007, 18:33 | #12 |
Участник
|
Можно обобщить и сказать, что ссылка была на мой личный BestPractice, основанный на опыте собственных шишек |
|