我在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'
答案 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'