Цитата:
Сообщение от
mazzy
...
Аксапта может разбить один запрос на несколько вложенных если в середине используется временная таблица или нет полей для выборки.
Например,
select table1 where ...
join table2 where ...
join table3 where ...
ЕСЛИ table2
...
2. или выключенному конфигурационному
...
ТО на sql пойдет не один запрос, а несколько вложенных.
...
Чего-то я себе это немного по-другому представлял. Можешь пояснить?
Вот джоб написал.
static void glibs()
{
InventTable inventTable;
PlInventTransExternal plInventTransExternal;
InventDim inventDim;
;
select inventTable
join plInventTransExternal
where inventTable.ItemId == plInventTransExternal.ItemId
join inventDim
where inventDim.inventDimId == plInventTransExternal.InventDimId;
}
Польша у меня отключена. Получаю (4.0):
Error Message (02:31:32) Cannot select a record in Items (InventTable).
Temporary tables must be the inner tables when joined to permanent tables.
Info Message (02:31:32) (C)\Jobs\glibs - line 8
Если польскую таблицу поставить первой, то отработает без ошибки. Только ничего не вернет. Я б тоже так поступил. Между таблицами отсутствует связь в таком случае. По-моему, логично.
Цитата:
Сообщение от
mazzy
...
Чтобы таблица гарантировано попала в SQL запрос, запрос по ней должен содержать хотя бы одно хранимое на SQL поле.
...
А наличие чего-то в where разве этого не гарантирует?
А если в твоем примере
table1 — это CustInvoiceJour
table2 — это CustInvoiceTrans
table3 — это InventDim
и нам нужно CustInvoiceJour.OrderAccount и InventDim.InventLocationId, то какой запрос пойдет на сервер в таком случае?
Ну, если вот так вот написать
static void glibs()
{
CustInvoiceJour custInvoiceJour;
CustInvoiceTrans custInvoiceTrans;
InventDim inventDim;
;
while select OrderAccount from custInvoiceJour
join TableId from custInvoiceTrans
where custInvoiceTrans.SalesId == custInvoiceJour.SalesId &&
custInvoiceTrans.InvoiceId == custInvoiceJour.InvoiceId &&
custInvoiceTrans.InvoiceDate == custInvoiceJour.InvoiceDate &&
custInvoiceTrans.numberSequenceGroup == custInvoiceJour.numberSequenceGroup
join InventLocationId from inventDim
where inventDim.inventDimId == custInvoiceTrans.InventDimId
{
info (strfmt("%1 -- %2", custInvoiceJour.OrderAccount, inventDim.InventLocationId));
}
}
Цитата:
Сообщение от
mazzy
...
Поэтому tableId использовать опасно. TableId - не хранимое поле.
...
Если по таблице необходимо наложить условие в where, то почему бы и нет?
Я поддерживаю участника Vadik в этом вопросе.
SHiSHok, как говорил... все тот же Vadik, когда я начинал учиться писать запросы в Аксапте, "* from" можно не писать.