14.03.2014, 00:34 | #1 |
MCITP
|
Некорректная работа notExists join
Всем привет!
Как такое может быть? (Извиняюсь что много текста, просто показываю все варианты что я перепробовал). X++: static void Job69(Args _args) { AM_SalesParmBatchSeq parmseq, invSeq; AM_SalesBAtchSeq salesSeq; InventTransid _inventTransid = "LT01125843"; ParmId _parmId = "01354429_sys"; int cnt; ; ttsBegin; delete_from invSeq where invSeq.parmid == _parmid; select count(recId) from salesSeq where salesSeq.InventTransId == _inventTransid && !salesSeq.InvoiceId notexists join parmseq where parmseq.InventTransId == salesSeq.InventTransId && parmseq.InventBatchId == salesSeq.InventBatchId && parmseq.sequenceNum == salesSeq.sequenceNum && parmseq.ParmId == _parmid; info(int2str(salesSeq.RecId)); // 184 While select salesSeq where salesSeq.InventTransId == _inventTransid && !salesSeq.InvoiceId notexists join parmseq where parmseq.InventTransId == salesSeq.InventTransId && parmseq.InventBatchId == salesSeq.InventBatchId && parmseq.sequenceNum == salesSeq.sequenceNum && parmseq.ParmId == _parmid { cnt++; } info(int2str(cnt)); // 184 cnt = 0; While select salesSeq order by InventBatchId, SequenceNumber // !!! where salesSeq.InventTransId == _inventTransid && !salesSeq.InvoiceId notexists join parmseq where parmseq.InventTransId == salesSeq.InventTransId && parmseq.InventBatchId == salesSeq.InventBatchId && parmseq.sequenceNum == salesSeq.sequenceNum && parmseq.ParmId == _parmid { invSeq.clear(); invSeq.InventTransId = _inventTransid; invSeq.InventBatchId = salesseq.InventBatchId; invSeq.SequenceNumber = salesseq.SequenceNumber; invSeq.parmid = _parmid; invSeq.insert(); cnt++; } info(int2str(cnt)); // 184 cnt = 0; delete_from invSeq where invSeq.parmid == _parmid; While select salesSeq where salesSeq.InventTransId == _inventTransid && !salesSeq.InvoiceId { select firstonly parmseq where parmseq.InventTransId == salesSeq.InventTransId && parmseq.InventBatchId == salesSeq.InventBatchId && parmseq.sequenceNum == salesSeq.sequenceNum && parmseq.ParmId == _parmid; if (! parmSeq) { invSeq.clear(); invSeq.InventTransId = _inventTransid; invSeq.InventBatchId = salesseq.InventBatchId; invSeq.SequenceNumber = salesseq.SequenceNumber; invSeq.parmid = _parmid; invSeq.insert(); cnt++; } } info(int2str(cnt)); // 184 cnt = 0; delete_from invSeq where invSeq.parmid == _parmid; While select salesSeq // order by InventBatchId, SequenceNumber // !!! where salesSeq.InventTransId == _inventTransid && !salesSeq.InvoiceId notexists join parmseq where parmseq.InventTransId == salesSeq.InventTransId && parmseq.InventBatchId == salesSeq.InventBatchId && parmseq.sequenceNum == salesSeq.sequenceNum && parmseq.ParmId == _parmid { invSeq.clear(); invSeq.InventTransId = _inventTransid; invSeq.InventBatchId = salesseq.InventBatchId; invSeq.SequenceNumber = salesseq.SequenceNumber; invSeq.parmid = _parmid; invSeq.insert(); cnt++; } ttsAbort; info(int2str(cnt)); // 100 (или 70) } PHP код:
Вероятно это как-то связано с SQL сервером, но у меня идеи закончились уже куда смотреть. Может кто-то сталкивался? DAX 2009 5.0.1500.1670 SQL Server 2008 10.50.2500 Уровень изоляции - как положено, read_committed_snapshot. Причём, пока я не поигрался немного с индексом (а именно прописал а потом удалил кластерный индекс у AM_SalesParmBatchSeq таблицы в AOT) вместо 100 в последнем цикле выдавалось 70. Пробовал воспроизвести на новых упрощённых таблицах - не получилось. Спасибо!
__________________
Zhirenkov Vitaly |
|