Вложенные notExists присоединяются к X ++ (Dynamics AX3.0) - PullRequest
2 голосов
/ 05 февраля 2009

Когда выполняется следующий код:

   select sum(qty) from inventTrans
        index hint TransTypeIdx
        where inventTrans.ItemId        == itemId
           && inventTrans.TransType     == InventTransType::Sales
           && inventTrans.InventDimId   == inventDimId
        notExists join custTable
        where custTable.AccountNum      == inventTrans.CustVendAC
           && custTable.CustGroup       == custGroupId
        notExists join salesTable
        where salesTable.SalesId        == inventTrans.TransRefId
           && salesTable.Extraordinary  == NoYes::Yes;

Сгенерированный sql встраивает второе соединение notExists (salesTable) в предложение where первого соединения notExists (custTable). т.е.

SELECT SUM(A.QTY)
FROM
    INVENTTRANS A
WHERE
    A.DATAAREAID  = 'MyCompany'
AND A.ITEMID      = 'MyItem'
AND A.TRANSTYPE   = 0
AND A.INVENTDIMID = 'SomeValue'
AND NOT EXISTS (SELECT 'x'
                FROM CUSTTABLE C
                WHERE C.DATAAREAID  ='MyCompany'
                AND C.ACCOUNTNUM    =A.CUSTVENDAC
                AND C.CUSTGROUP     ='SomeCustGroup'
                AND NOT EXISTS (SELECT 'x'
                                FROM SALESTABLE B
                                WHERE
                                    B.DATAAREAID    ='MyCompany'
                                AND B.SALESID       =A.TRANSREFID
                                AND B.EXTRAORDINARY =1))

Есть ли способ написать запрос выбора X ++ в notExists, соединяющий salesTable с таблицей изобретением вместо таблицы custTable, чтобы сгенерированный SQL был похож на следующий?

SELECT SUM(A.QTY)
FROM
    INVENTTRANS A
WHERE A.DATAAREAID     = 'MyCompany'
AND A.ITEMID           = 'MyItem'
AND A.TRANSTYPE        = 0
AND A.INVENTDIMID      = 'SomeValue'
AND NOT EXISTS (SELECT 'x'
                FROM CUSTTABLE C
                WHERE C.DATAAREAID  ='MyCompany'
                AND C.ACCOUNTNUM    =A.CUSTVENDAC
                AND C.CUSTGROUP     ='SomeCustGroup')
AND NOT EXISTS (SELECT 'x'
                FROM SALESTABLE B
                WHERE
                    B.DATAAREAID='MyCompany'
                AND B.SALESID=A.TRANSREFID
                AND B.EXTRAORDINARY=1)

Ответы [ 2 ]

1 голос
/ 08 августа 2012

Возможно, вы больше не ждете ответа, но на Axe 2012 у меня все еще возникала та же проблема.

Нашел другое решение (кроме использования оператора SQL), не самое эффективное, но оно работает:

  • Создайте запрос: выберите * из изобретений. К списку записок присоединяются CustTable ....
  • Создать представление на основе этого запроса
  • сделать то же самое для salesTable
  • измените свой оператор выбора следующим образом:

    выберите изобретенийTrans

    ...

    существует присоединиться к myCustView

    где myCustView.InventTransRecId ==ventTrans.RecId

    существует присоединиться к mySalesView

    где ...

Надеюсь, это поможет,

T

1 голос
/ 17 апреля 2009

Краткий ответ: нет!

В вашем примере вы можете переформулировать, используя внутреннее соединение:

select sum(qty) from inventTrans
    index hint TransTypeIdx
    where inventTrans.ItemId        == itemId
       && inventTrans.TransType     == InventTransType::Sales
       && inventTrans.InventDimId   == inventDimId
    join salesTable
    where salesTable.SalesId        == inventTrans.TransRefId
       && salesTable.Extraordinary  == NoYes::No;
    notExists join custTable
    where custTable.AccountNum      == inventTrans.CustVendAC
       && custTable.CustGroup       == custGroupId

Должно работать, если вы не удаляете заказы на продажу при выставлении счетов.

...