12.02.2014, 16:09 | #1 |
Участник
|
Вложенные Notexists Join в запросе
Здравствуйте, коллеги.
В очередной раз столкнулся с проблемой, связанной с объединением таблиц методом NotExists Join в запросе. Решил тактической расстановкой костылей в нужных местах, но осадочек остался . Может всё-таки есть решение? Используется DAX 4 SP 2. Ещё интересно, есть ли решение в более поздних версиях системы. Вот такой вот запрос: X++: select recid from table1 notExists join table2 where table2.Id == table1.Table2Id notExists join table3 where table3.Id == table1.Table3Id X++: SELECT A.recid FROM table1 A WHERE A.DATAAREAID='DAT' AND NOT EXISTS (SELECT 'x' FROM table2 C WHERE C.DATAAREAID='DAT' AND C.Id=A.Table2Id AND NOT EXISTS (SELECT 'x' FROM table3 B WHERE B.DATAAREAID='DAT' AND B.Id=A.Table3Id)) X++: SELECT A.recid FROM table1 A WHERE A.DATAAREAID='DAT' AND NOT EXISTS (SELECT 'x' FROM table2 C WHERE C.DATAAREAID='DAT' AND C.Id=A.Table2Id) AND NOT EXISTS (SELECT 'x' FROM table3 B WHERE B.DATAAREAID='DAT' AND B.Id=A.Table3Id) |
|
12.02.2014, 18:04 | #2 |
Участник
|
См. AX2009. Не используйте NotExists - она упоминается в "Похожих темах" внизу страницы.
|
|
13.02.2014, 10:48 | #3 |
Участник
|
Добрался до 2009 аксапты, в ней действительно можно получить требуемый результат, но только через Query (проверено на MS SQL). К сожалению, в четвёрке не работает, видимо из-за отсутствия поддержки "разветвлённых" запросов, когда к главному датасорсу цепляется несколько вложенных.
X++: Query q; QueryBuildDatasource qbds, qbdsNE; QueryRun qr; ; q = new Query(); qbds = q.addDataSource(tablenum(Table5), 'Table5'); qbdsNE = qbds.addDataSource(tablenum(Table6)); qbdsNE.joinMode(JoinMode::NoExistsJoin); qbdsNE.addLink(fieldnum(Table5, Table6Id), fieldnum(Table6, Id), 'Table5'); qbdsNE = qbds.addDataSource(tablenum(Table7)); qbdsNE.joinMode(JoinMode::NoExistsJoin); qbdsNE.addLink(fieldnum(Table5, Table7Id), fieldnum(Table7, Id), 'Table5'); qr = new QueryRun(q); qr.next(); X++: SELECT A.ID,A.TABLE6ID,A.TABLE7ID,A.RECVERSION,A.RECID FROM TABLE5 A WHERE (A.DATAAREAID='DAT') AND NOT EXISTS (SELECT 'x' FROM TABLE6 B WHERE ((B.DATAAREAID='DAT') AND (A.TABLE6ID=B.ID))) AND NOT EXISTS (SELECT 'x' FROM TABLE7 C WHERE ((C.DATAAREAID='DAT') AND (A.TABLE7ID=C.ID))) ORDER BY A.DATAAREAID,A.RECID |
|
13.02.2014, 10:59 | #4 |
Участник
|
|
|
13.02.2014, 12:53 | #5 |
Участник
|
Без fetchMode четвёрка в аналогичном query вообще игнорирует подчинённые датасорсы. А с QueryFetchMode::One2One запрос таки формируется, но криво:
X++: q = new Query(); qbds = q.addDataSource(tablenum(Table5), 'Table5'); qbdsNE = qbds.addDataSource(tablenum(Table6), 'Table6'); qbdsNE.joinMode(JoinMode::NoExistsJoin); qbdsNE.fetchMode(QueryFetchMode::One2One); qbdsNE.addLink(fieldnum(Table5, Table6Id), fieldnum(Table6, Id)); qbdsNE = qbds.addDataSource(tablenum(Table7), 'Table7'); qbdsNE.joinMode(JoinMode::NoExistsJoin); qbdsNE.fetchMode(QueryFetchMode::One2One); qbdsNE.addRange(fieldnum(Table7, RecId)).value('(Table7.Id==Table5.Table7Id)'); qr = new QueryRun(q); qr.next(); X++: SELECT A.ID, A.TABLE6ID, A.TABLE7ID, A.RECVERSION, A.RECID FROM TABLE5 A WHERE (A.DATAAREAID = 'DAT') AND NOT EXISTS (SELECT 'x' FROM TABLE6 B WHERE ((B.DATAAREAID = 'DAT') AND (A.TABLE6ID = B.ID)) AND NOT EXISTS (SELECT 'x' FROM TABLE7 C WHERE ((C.DATAAREAID = 'DAT') AND (A.TABLE7ID = C.ID)))) ORDER BY A.DATAAREAID, A.RECID |
|