2014-09-24 6 views
1

Следующий SQL Query находит заказы, соответствующие определенным требованиям, а затем создает новый порядок (InvNum) со строками счетов (_btblInvoiceLines) на данном этапе, он создал только базовую информацию.MSSQL INNER JOIN WHERE Статья

DECLARE @gid varchar(50) SELECT @gid = newid() 

INSERT INTO InvNum (DocType,DocState,AccountID,ucIDSOrdTempInvID) 
SELECT 4,1,AccountID,@gid 
FROM (SELECT DISTINCT AccountID 
     FROM InvNum 
     WHERE ubIDSOrdConsolOrder = '1' 
     AND DocState = '1' 
     AND DocType <> '5') A 


INSERT INTO _btblInvoiceLines (iInvoiceID, iStockCodeID, fQuantity) 
SELECT AutoIndex, iStockCodeID, qty 
FROM (SELECT AutoIndex, iStockCodeID, qty 
     FROM (SELECT AutoIndex,AccountId,ucIDSOrdTempInvID 
      FROM InvNum 
      WHERE ucIDSOrdTempInvID = @gid) T1 
     INNER JOIN (SELECT B.iStockCodeID,A.AccountID,sum(B.fQuantity) AS qty 
        FROM (SELECT * 
         FROM InvNum 
         WHERE ubIDSOrdConsolOrder = '1' 
         AND DocState = '1' 
         AND DocType <> '5') A  
        INNER JOIN (SELECT * 
           FROM _btblInvoiceLines) B ON A.AutoIndex = B.iInvoiceID 
        GROUP BY iStockCodeID, AccountID) T2 ON T1.AccountId = T2.AccountID) T3 

После этого колонка InvNum обновляется, это прекрасно работает. Моя проблема заключается в следующем, который обновляет _btblInvoiceLines нового порядка и новые линии с этим старых порядками, то, что соответствует: WHERE ubIDSOrdConsolOrder = '1' AND DocState = '1' AND DocType <> '5'

Это ЕК является то, что неверно:

SELECT D1.* 
FROM (SELECT A.* 
     FROM _btblInvoiceLines A 
     INNER JOIN (SELECT max(idInvoiceLines) as idInvoiceLines, iStockCodeID 
        FROM _btblInvoiceLines 
        GROUP BY iStockCodeID) B ON A.idInvoiceLines = B.idInvoiceLines) D1 
     INNER JOIN (SELECT * 
        FROM _btblInvoiceLines I1 
        INNER JOIN (SELECT accountid,autoindex,ucIDSOrdTempInvID 
           FROM InvNum 
           WHERE ucIDSOrdTempInvID = @gid) I2 ON I1.iInvoiceID = I2.AutoIndex) D2 ON D1.iStockCodeID = D2.iStockCodeID 
     WHERE _btblInvoiceLines.idInvoiceLines = D2.idInvoiceLines 

Я потерял способ сделать D1. * Вытащить информацию из последней оригинальной _btblInvoiceLines, которая была добавлена ​​в новые заказы, D2. Единственный способ, которым я считаю, что я могу это сделать, - использовать следующий SELECT DISTINCT AccountID,ubIDSOrdConsolOrder FROM InvNum WHERE ubIDSOrdConsolOrder = '1' AND DocState = '1' AND DocType <> '5', но я не могу понять, как правильно это сделать. Извините, если это простой вопрос, но я искал и пытался решить эту проблему в течение 2 дней без везения.

спасибо.

+2

Можете ли вы отформатировать код с помощью нескольких новых строк между операторами и вкладками? Я думаю, это увеличит ваш шанс получить айсберга. – artm

+0

Поблагодарите artm, отпустите его. К сожалению, первый раз задавая вопрос – doobie

+0

Какой поставщик SQL вы используете? –

ответ

1

У меня был INNER JOIN в неправильном порядке. Я сделал следующее, и теперь это работает правильно:

SELECT D1.* 
FROM (SELECT DISTINCT AccountID, AutoIndex FROM InvNum WHERE ubIDSOrdConsolOrder = '1' AND DocState = '1' AND DocType <> '5') A1 

    INNER JOIN (SELECT * FROM _btblInvoiceLines) D1 ON A1.AutoIndex = D1.iInvoiceID---- 

    INNER JOIN (SELECT max(idInvoiceLines) as idInvoiceLines, iStockCodeID FROM _btblInvoiceLines GROUP BY iStockCodeID) I1 ON D1.iStockCodeID = I1.iStockCodeID 

    INNER JOIN (SELECT * FROM _btblInvoiceLines I1 INNER JOIN (select accountid,autoindex,ucIDSOrdTempInvID FROM InvNum where ucIDSOrdTempInvID = @gid) I2 ON I1.iInvoiceID=I2.AutoIndex) D2 ---- @gid 
ON D1.iStockCodeID=D2.iStockCodeID 

WHERE _btblInvoiceLines.idInvoiceLines = D2.idInvoiceLines 
Смежные вопросы