繁体   English   中英

SQL Server 2008: Select 然后更新语句

[英]SQL Server 2008: Select then update statement

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

在 mod_employmentAppJobs 上,我需要为选择的每一行设置一列为真。 基本上,这会设置一个标志,告诉 sql 不要 select 该列,因为我们已经向该用户发送了 email。 这是一个位领域。

如何在 SQL 语句中将 emailSent 字段设置为 true? -- 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'

您可以将结果存储在临时表中。 您可以使用临时表中的数据,最后仍然返回。 打字很多,但非常简单:

-- 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)首先使用临时表和 select 数据,更新 mod_employmentAppJobs,然后从临时表中执行 select 以检索您的数据。

所以,它看起来像这样。

创建临时表

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 来满足口味和业务需求。

此外,在您完成临时表后删除它是一种很好的方式,即使 SQL 服务器如果您不这样做也不会受到冒犯。

2)可以使用更新语句的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 已插入。*

这应该让你的结果集回到你的应用层

如果您需要更新然后返回数据,那么最好的方法可能是使用存储过程,您首先查询数据,更新它然后返回它。

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

我只是在最后加上了一个,它起作用了:

    UPDATE mod_employmentAppJobs
    SET emailSent = 'True'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM