4

次のコードが実行されると:

   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 は、2 番目の notExists 結合 (salesTable) を最初の notExists 結合 (custTable) の where 句にネストします。すなわち

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 が custTable の代わりに salesTable を inventTrans テーブルに結合するように記述する方法はありますか? その場合、生成される 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)
4

2 に答える 2

1

短い答え:いいえ!

あなたの例では、内部結合を使用して再構成できます。

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

請求時に販売注文を削除しない限り、機能するはずです。

于 2009-04-17T06:57:33.657 に答える
1

あなたはおそらくもう答えを待っていませんが、Ax 2012 でも同じ問題が発生しました。

最もパフォーマンスの高いソリューションではありませんが、別のソリューションを見つけました (SQL ステートメントを使用する以外に) が、機能します。

  • クエリを作成します: select * from inventTrans notexists join CustTable ....
  • そのクエリに基づいてビューを作成します
  • salesTable についても同じことを行います
  • select ステートメントを次のように変更します。

    inventTrans を選択

    ...

    myCustView に参加する

    どこで myCustView.InventTransRecId == inventTrans.RecId

    mySalesView に参加する

    どこ ...

お役に立てれば、

T

于 2012-08-08T12:21:38.840 に答える