Я пытаюсь написать отчет, который на первый взгляд кажется довольно простым.Однако после многочисленных попыток я изо всех сил пытаюсь найти подход, который работает.У нас есть около 350 тыс. Записей в VendTable, но поставщики дублируются в 26 компаниях, поэтому на самом деле существует около 13 тыс. УНИКАЛЬНЫХ учетных записей поставщиков.
Я пытаюсь написать отчет, который возвращает любого поставщика, у которого не было заказа на поставку, счет-фактураи Оплата (BuyTable, VendInvoiceJour и VendTable соответственно) с определенной даты.
Сложная часть (для меня) состоит в том, что все ключи содержат dataareaid, но я хочу, чтобы мой запрос выполнялся независимо от этого.Я не имею в виду crossCompany, потому что это возвратило бы (до) 26 записей для одного Продавца (так как оно существует 26 раз в базе данных).Для ясности, если у поставщика А есть ПО в ЛЮБОЙ компании, я не хочу, чтобы поставщик А возвращал в моем наборе результатов ВСЕ.
Я попытался сделать это, используя запрос ниже (+ '' наAccountNum обманывает AOT, поэтому результирующий SQL-запрос удаляет dataareaid из подзапроса), но результирующий SQL-запрос был «НЕ (EXIST»), поэтому NOTs отменяют, вызывая непредвиденные и неправильные результаты.
X ++ Code
while select crossCompany AccountNum, InvoiceAccount, NBDCMMSAllowInvoices, VendGroup, Party
from vendTable
group by AccountNum, InvoiceAccount, Party, VendGroup, NBDCMMSAllowInvoices
where vendTable.Blocked != CustVendorBlocked::All
notExists join * from purchTable WHERE
purchTable.OrderAccount == vendTable.AccountNum+''
&& purchTable.createdDateTime > cutoffDate
notExists join * from vendTrans
where vendTrans.AccountNum == vendTable.accountNum+''
&& vendTrans.TransDate > cutoffDateTrans
notExists join * from vendInvoiceJour
where vendInvoiceJour.InvoiceAccount == vendTable.accountNum+''
&& vendInvoiceJour.InvoiceDate > cutoffDateTrans
Результирующий SQL:
SELECT T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.NBDCMMSALLOWINVOICES,T1.VENDGROUP,T1.PARTY,T1.DATAAREAID,T1.RECID
FROM VENDTABLE T1 WHERE ((T1.PARTITION = PartitionID) AND (T1.BLOCKED <> 2))
AND NOT (EXISTS (SELECT 'x' FROM PURCHTABLE T2 WHERE
((T2.PARTITION = PartitionID) AND ((T2.ORDERACCOUNT=T1.ACCOUNTNUM AND (T2.DATAAREAID = T1.DATAAREAID) AND (T2.PARTITION = T1.PARTITION)) AND (T2.CREATEDDATETIME>?)))
AND NOT (EXISTS (SELECT 'x' FROM VENDTRANS T3 WHERE
((T3.PARTITION = PartitionID) AND ((T3.ACCOUNTNUM=T1.ACCOUNTNUM AND (T3.DATAAREAID = T1.DATAAREAID) AND (T3.PARTITION = T1.PARTITION)) AND (T3.TRANSDATE>?)))
AND NOT (EXISTS (SELECT 'x' FROM VENDINVOICEJOUR T4 WHERE
((T4.PARTITION = PartitionID) AND ((T4.INVOICEACCOUNT=T1.ACCOUNTNUM AND (T4.DATAAREAID = T1.DATAAREAID) AND (T4.PARTITION = T1.PARTITION)) AND (T4.INVOICEDATE>?)))
)
)
)
)
)
) GROUP BY T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.NBDCMMSALLOWINVOICES,T1.VENDGROUP,T1.PARTY ORDER BY T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.NBDCMMSALLOWINVOICES,T1.VENDGROUP,T1.PARTY
Эти вложенные объединения НЕ СУЩЕСТВУЮТ вызывают у меня горе. Есть ли способ обойти это, или, может быть, совершенно другой подход?