на Х++
PHP код:
static void VVL_Job24(Args _args)
{
TmpTable tmpTable;
TmpTable2 tmpTable2;
TmpTable3 tmpTable3;
;
while select tmpTable
exists join tmpTable2
exists join tmpTable3 where (tmpTable3.ItemId == tmpTable.ItemId || tmpTable2.ItemId == tmpTable.ItemId)
{
info(tmpTable.ItemId);
}
}
к БД (у меня MS SQL) идет что-то вроде
SELECT A.ITEMID,A.BOMLEVEL,A.RECID
FROM TMPTABLE A WHERE (A.DATAAREAID=?)
AND EXISTS (SELECT 'x' FROM TMPTABLE2 B
WHERE (B.DATAAREAID=?) AND EXISTS (SELECT 'x' FROM TMPTABLE3 C
WHERE ((C.DATAAREAID=?) AND ((C.ITEMID=A.ITEMID) OR (B.ITEMID=A.ITEMID))))) OPTION(FAST 100)
ну и с помощью Query:
PHP код:
static void VVL_Job25(Args _args)
{
TmpTable tmpTable;
Query query;
QueryBuildDataSource qbds;
QueryBuildDataSource qbds2;
QueryBuildDataSource qbds3;
QueryRun queryRun;
;
query = new Query();
qbds = query.addDataSource(tablenum(TmpTable));
qbds.clearSortIndex();
qbds2 = qbds.addDataSource(tablenum(TmpTable2));
qbds2.relations(false);
qbds2.joinMode(joinMode::ExistsJoin);
qbds3 = qbds2.addDataSource(tablenum(TmpTable3));
qbds3.relations(false);
qbds3.joinMode(joinMode::ExistsJoin);
qbds3.addRange(fieldnum(TmpTable3, ItemId)).value(strfmt(
"((%3.%6 == %1.%4) || (%2.%5 == %1.%4))",
qbds.name(),
qbds2.name(),
qbds3.name(),
fieldstr(TmpTable, ItemId),
fieldstr(TmpTable2, ItemId),
fieldstr(TmpTable3, ItemId)
));
queryRun = new QueryRun(query);
while (queryRun.next())
{
tmpTable = queryRun.getNo(1);
info(tmpTable.ItemId);
}
}
к БД:
SELECT A.ITEMID,A.BOMLEVEL,A.RECID
FROM TMPTABLE A WHERE (A.DATAAREAID=?)
AND EXISTS (SELECT 'x' FROM TMPTABLE2 B
WHERE (B.DATAAREAID=?) AND EXISTS (SELECT 'x' FROM TMPTABLE3 C
WHERE ((C.DATAAREAID=?) AND ((C.ITEMID=A.ITEMID) OR (B.ITEMID=A.ITEMID))))) ORDER BY A.DATAAREAID,A.RECID OPTION(FAST 100)
Вроде работает...
но есть вопрос (хотя и не по теме):
Кто-нибудь знает, как избавиться от "ORDER BY" при использовании Query?