嵌套的notExists加入X ++(Dynamics AX3.0)

时间:2009-02-05 03:41:55

标签: axapta microsoft-dynamics x++

执行以下代码时:

   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 join(salesTable)嵌入到第一个notExists join(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 ++ select查询写入notExists将salesTable连接到inventTrans表而不是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 个答案:

答案 0 :(得分: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

如果您在开发票时不删除销售订单,它应该可以使用。

答案 1 :(得分:1)

你可能不再等待答案了,但在Axe 2012上我仍然遇到了同样的问题。

找到另一个解决方案(除了使用SQL语句),而不是最高性能的解决方案,但它可以工作:

  • 创建一个查询:select * from inventTrans notexists join CustTable ....
  • 根据该查询创建视图
  • 对salesTable
  • 执行相同操作
  • 更改您的select语句,如下所示:

    选择inventTrans

    ...

    存在加入myCustView

    其中myCustView.InventTransRecId == inventTrans.RecId

    存在加入mySalesView

    其中......

希望这有帮助,

Ť