2011-05-02 66 views
1

我正在做一個跨INNER 6代JOIN表爲我的應用模塊,基本上它採用prostaff的得到他們的姓名和電子郵件,並進行比較,爲求職者名單。SQL Server 2008中:選擇然後更新語句

在mod_employmentAppJobs我需要爲選擇真正的每一行一列。基本上這設置了一個標誌,告訴sql不要選擇列,因爲我們已經發送了該用戶的電子郵件。這是一個領域。

我如何emailSent字段設置爲true的SQL語句? - Coldfusion 8是應用程序服務器,僅供參考....

SELECT * 
FROM pro_Profile p 
     INNER JOIN pro_Email e ON p.profileID = e.profileID 
     INNER JOIN mod_userStatus m ON p.profileID = m.profileID 
     <!--- Joins the pro staff profiles to the employment app ---> 
     INNER JOIN mod_employmentAppJobTitles a ON p.profileID = a.departmentID 
     <!--- Join Job titles to the jobs ---> 
     INNER JOIN mod_employmentAppJobs b ON a.jobTitleID=b.jobTitleID 
     <!--- Joining the table on where the profile equals everything else ---> 
     INNER JOIN mod_employmentAppProfile c ON c.eAppID = b.eAppID 
WHERE b.emailSent = 'False' 
+0

如果它是一個位字段,我想你可以設置爲1 (對於真)或0(對於假)。 – Marco 2011-05-02 20:17:17

+0

這也是這筆交易,它需要更新,但它需要在SQL之後返回數據。 – 2011-05-02 20:17:55

+0

如果設置爲false,它會更容易閱讀,並且可以以任何方式工作。 – 2011-05-02 20:18:25

回答

2

您有幾個選擇。

1)從臨時表使用臨時表,並首先選擇數據有,更新mod_employmentAppJobs,並進行選擇來獲得檢索到的數據。

因此,它看起來像這樣。

創建臨時表

CREATE TABLE #tmpTABLE 
(
    EmailAddress varchar(100), 
    JobTitle varchar(50), 
    JobTitleId bigint 
    ...... 
) 

插入它

INSERT INTO #tmpTable 
SELECT EmailAddress,JobTitle, ........ 
    FROM pro_Profile p 
    INNER JOIN pro_Email e 
    ON p.profileID = e.profileID 
    INNER JOIN mod_userStatus m 
    ON p.profileID = m.profileID 
    <!--- Joins the pro staff profiles to the employment app ---> 
    INNER JOIN mod_employmentAppJobTitles a 
    ON p.profileID = a.departmentID 
    INNER JOIN mod_employmentAppJobs b 
    <!--- Join Job titles to the jobs ---> 
    ON a.jobTitleID=b.jobTitleID 
    <!--- Joining the table on where the profile equals everything else ---> 
    INNER JOIN mod_employmentAppProfile c 
    ON c.eAppID = b.eAppID 
    WHERE b.emailSent = 'False' 

更新源表(我建議在jobTitleId指數在臨時表的性能,如果適用)

UPDATE mod_employmentAddJobs 
    SET EmailSent="true" 
    FROM mod_employmentAppJobs b 
     INNER JOIN #tmpTable tmp 
    ON b.jobTitleID=tmp.jobTitleID 

獲取的實際數據傳回應用層

SELECT * FROM #tmpTable 

爲了更好的味道,我建議與BEGIN TRAN灑... ... COMMIT ROLLBACK並開始TRY..END TRY BEGIN CATCH ... END CATCH品嚐和業務需求。

此外,這是禮貌下降臨時表,你用它做之後,即使你沒有SQL服務器將不會見怪。

2)您可以使用update語句的OUTPUT子句。

UPDATE mod_employmentAddJobs 
    SET EmailSent="true" 
    FROM pro_Profile p 
    INNER JOIN pro_Email e 
    ON p.profileID = e.profileID 
    INNER JOIN mod_userStatus m 
    ON p.profileID = m.profileID 
    <!--- Joins the pro staff profiles to the employment app ---> 
    INNER JOIN mod_employmentAppJobTitles a 
    ON p.profileID = a.departmentID 
    INNER JOIN mod_employmentAppJobs b 
    <!--- Join Job titles to the jobs ---> 
    ON a.jobTitleID=b.jobTitleID 
    <!--- Joining the table on where the profile equals everything else ---> 
    INNER JOIN mod_employmentAppProfile c 
    ON c.eAppID = b.eAppID 
    WHERE b.emailSent = 'False' 

插入輸出。*

這應該讓你的結果集馬上回你的應用程序層

2

您可以將結果存儲在臨時表中。您可以使用臨時表中的數據,並在最後返回它。這是一個很大的打字,但非常簡單:

-- Select data into temporary table 
declare @result table (jobTitleID int, ...) 

INSERT @result 
     (jobTitleID, ...) 
SELECT jobTitleID 
FROM pro_Profile p 
... 

-- Update unreadMail flag 
update mod_employmentAppJobs 
set  unreadMail = 'False' 
where jobTitleID in (select jobTitleId from @result) 

-- Return result to application 
select jobTitleId, ... 
from @result 
0

如果您需要更新,然後返回數據,則可能是最好的方法是使用一個存儲過程,您第一次查詢的數據,更新它,然後返回它。

0

那麼,這只是一個想法,而不是最好的解決方案。
您可以在DataReader中獲取數據(哪些位爲false),然後對包含在Dataset中的id執行Command設置位爲true。
數據集返回您需要的數據...

0

我只是上漲一上月底,它的工作:

UPDATE mod_employmentAppJobs 
    SET emailSent = 'True' 
+0

但是,如果在啓動SELECT語句和執行UPDATE語句之間存在插入操作,會發生什麼情況?當它們從未從SELECT語句返回時,會有標記爲TRUE的記錄。 – 2011-05-02 20:44:01