2011-01-19 2 views
1

Я работаю над проектом перезаписи базы данных MS Access, который мы конвертируем в серверный сервер SQL Server 2005/Winform. У меня есть запрос в Access, который мне нужно преобразовать для запуска на SQL-сервере. Вот запрос доступа:Таблица обновления SQL, присоединившись к той же таблице

UPDATE DISTINCTROW VAR, CancelsinTrans 
INNER JOIN Trans ON (CancelsinTrans.ACCT = Trans.ACCT) AND (CancelsinTrans.ITEM_ID = Trans.ITEM_ID) 
SET Trans.TRAN_CD = "1", Trans.LastUpdated = Date() 
WHERE (((Trans.TRAN_CD)<>"1" Or (Trans.TRAN_CD) Is Null) AND 
((CancelsinTrans.TRAN_DT)<[VAR]![Import1]) AND 
((Trans.TRAN_DT)<[VAR]![Import1])); 

The CancelsinTrans является запрос, потянув счета из таблицы Trans - так в основном она присоединяется на себя и выполняет обновление.

Вот CancelsInTrans запрос:

SELECT Trans.ACCT, Trans.TRAN_TYPE_CD, Trans.TRAN_SUBOR_CD, Trans.M_SRCE_CD, Trans.TRAN_RQST_CD, Trans.TRAN_AM, Trans.TRAN_DR_CR_CD, Trans.TRAN_CXL_CD, Trans.ACCTG_CD, Trans.ITEM_ID, Trans.TRAN_DT, Trans.TRAN_EXEC_TM, Trans.TRAN_QY, Trans.TRAN_NET, Trans.TRAN_EXEC_PR, Trans.M_SECURITY_NR, Trans.M_ORF_OR_ORDRNO, Trans.M_SEQ_NBR, Trans.TRAN_SETTL, Trans.M_ORDER_TAKER_ID, Trans.QUOTR_SEC, Trans.PROD_CD, Trans.SEC_CD, Trans.TRAN_EXEC_DT 
FROM Trans 
WHERE (((Trans.TRAN_TYPE_CD)="TR") AND ((Trans.TRAN_SUBOR_CD)="TR") AND ((Trans.TRAN_CD)="1") AND ((Trans.ACCTG_CD)="1")); 

Я пытаюсь выяснить, лучший способ, чтобы написать этот запрос. Я собирался использовать хранимую процедуру для запуска этого обновления, но должен ли я использовать функцию table для получения набора записей.

Любая помощь будет отличной.

Благодаря

ответ

2

Эквивалент SQL Server будет что-то вроде следующего:

Update Trans 
Set TRAN_CD = '1' 
    , LastUpdated = GETDATE() 
Where (Trans.TRAN_CD <> '1' Or Trans.TRAN_CD Is Null) 
    And Trans.TRAN_DT < 'some var value' 
    And Exists (
       Select 1 
       From CancelsinTrans As C1 
       Where C1.ACCT= Trans.ACCT 
        And C1.ITEM_ID = Trans.ITEM_ID 
        And C1.TRAN_DT < 'some var value' 
       ) 

В этом случае через параметризованного запроса, вы должны заменить some var value со значением от [VAR]![Import1], который я предполагаю, был значение формы.

UPDATE

Учитывая, что запрос CancelsInTran инкапсулирует таблицу Trans, вы можете устранить присоединиться к следующим образом:

Update Trans 
Set TRAN_CD = '1' 
    , LastUpdated = GetDate() 
Where TRAN_TYPE_CD = 'TR' 
    And TRAN_SUBOR_CD = 'TR' 
    And ACCTG_CD = '1' 
    And (TRAN_CD <> '1' Or TRAN_CD Is Null) 
    And TRAN_DT < 'some value' 
+0

Я на самом деле пытается удалить подзапрос, если это возможно. И используйте весь код для одной хранимой процедуры. – Taryn

+1

@bluefeet - Как удалить подзапрос, связанный с наличием кода в одной хранимой процедуре? Вышеупомянутый способ ANSI подходит для оператора Update. – Thomas

+0

В настоящее время CancelsInTrans представляет собой запрос MS Access, который мы собираемся удалить и заменить с помощью хранимой процедуры SQL. Этот запрос используется только один раз для выполнения этого обновления, поэтому кажется, что у него есть отдельный вызов. – Taryn

Смежные вопросы