我正在尝试改进正在处理的旧代码。可以简化当前代码,并使用SQL处理插入。这是示例:
<!--- Check if user exists in Table 1 --->
<cfquery name="checkUser" datasource="#application.datasource#">
SELECT user_id
FROM table1
WHERE user_id = '#session.user_id#'
</cfquery>
<cfif !checkUser.recordcount>
<cfset password = functions.encryptPsw("form.pswd") />
<cfquery name="getInfo" datasource="#datasource#">
SELECT fname, lname
FROM contact
WHERE userid = #session.user_id#
</cfquery>
<cfquery name="insertUser" datasource="#application.database#">
INSERT INTO inter_work_tbl (
user_id,
first_name,
last_name,
password
) VALUES (
'#session.user_id#',
'#trim(getInfo.fname)#',
'#trim(getInfo.lname)#',
'#password#'
)
</cfquery>
</cfif>
我想知道是否可以使用Sybase
SQL并使用IF NOT EXISTS
然后运行Insert语句吗?如果有人有好的榜样或建议,请告诉我。谢谢。
答案 0 :(得分:3)
我不知道/不能使用Coldfusion,所以不确定我是否正确阅读了逻辑...
table1
中不存在,但contact
中退出inter_work_tbl
一般的T-SQL查询看起来像(注意:将T-SQL与对ColdFusion变量的引用混合在一起):
insert into inter_work_tbl
(user_id
,first_name
,last_name
,password)
select '#session.user_id#',
c.fname,
c.lname,
'#password#'
from contact c
where c.userid = #session.user_id#
and not exists(select 1
from table1 t
where t.user_id = c.userid)
答案 1 :(得分:1)
您的问题是您要改善代码。既然如此,让我们从此开始。你有:
<cfif !checkUser.recordcount>
那不是真正可读或直观的。这是表达这种情况的另一种方法:
<cfif checkUser.recordcount eq 0>
接下来,在不太可能发生的情况下,您发布了实际代码,您的checkUser查询将在table1中查找记录,如果没有记录,则将记录放入另一个表inter_work_tbl中。似乎有点可笑。
接下来,您从名为contact的表中获取信息,并将其插入到inter_work_tbl表中。即使您认为您总是在联系表中有记录,如果没有,该怎么办?您的插入查询由于未定义的变量而崩溃。另外,为什么在表inter_work_tbl中需要名称?您已经在联系人表中。您无缘无故破坏规范化。
就将代码简化为仅使用sql而言,@ markp的答案向您展示了如何做到这一点。
答案 2 :(得分:0)
对不起,我的评论没有50的声誉,因此我将以此作为答复。听起来您可以简单地使用sql merge
语句来完成此操作。