SQL Server 2008:选择然后更新语句

时间:2011-05-02 20:14:48

标签: sql sql-server-2008

我在6个表中为我的应用程序的模块进行INNER JOIN,基本上需要prostaff获取他们的名字和电子邮件,并将其与求职者列表进行比较。

在mod_employmentAppJobs上,我需要为选中的每一行设置一列为true。基本上这设置了一个标志,告诉sql不要选择列,因为我们已经在该用户上发送了一封电子邮件。这是一个有点领域。

如何在SQL语句中将emailSent字段设置为true? - Coldfusion 8是应用服务器,只是FYI ....

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'

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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和BEGIN TRY..END TRY BEGIN CATCH ... END CATCH品尝和满足商业需求。< / p>

此外,在完成临时表之后删除临时表是很好的方法,即使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'

已插入OUTPUT。*

这应该会将结果集直接返回到您的应用层

答案 2 :(得分:0)

如果您需要更新然后返回数据,则最好使用存储过程,首先查询数据,更新数据然后返回。

答案 3 :(得分:0)

嗯,这只是一个想法,而不是最好的解决方案 您可以在DataReader中获取数据(对于哪个位为false),然后对数据集中包含的ID执行命令设置位为true。
数据集返回您需要的数据......

答案 4 :(得分:0)

我刚刚在最后添加了一个并且有效:

    UPDATE mod_employmentAppJobs
    SET emailSent = 'True'