基于列计算的SQL更新

基于列计算的SQL更新,sql,sql-server,Sql,Sql Server,我想知道是否有一种简单的方法可以使用T-SQL中的用例和if/ELSE语句生成一个查询,该查询将比较课程id在讲师中相同的行之间的列注册日期。以下是上下文: select u.user_id, cu.enrollment_date, cm.course_id from course_users cu join course_main cm on cu.crsmain_pk1 = cm.pk1 join users u on cu.users_pk1 = u.pk1 where cu.role =

我想知道是否有一种简单的方法可以使用T-SQL中的用例和if/ELSE语句生成一个查询,该查询将比较
课程id
在讲师中相同的行之间的列
注册日期
。以下是上下文:

select u.user_id, cu.enrollment_date, cm.course_id from course_users cu
join course_main cm on cu.crsmain_pk1 = cm.pk1
join users u on cu.users_pk1 = u.pk1
where cu.role = 'P' and cm.course_id like '%SP2014' and (cu.row_status = 0 or cu.row_status = 2)
order by course_id asc
此查询返回课程中所有讲师注册及其注册日期的列表。返回的行的示例如下:

user_id         enrollment_date           course_id
dennismennis    2014-01-27 14:55:30.253    MATH-101
stevenspielberg 2014-01-27 14:55:30.413    MATH-102
lemmings        2014-01-27 14:55:30.300    MATH-103
johndoe         2014-01-27 14:55:24.750    ENGL-101
bobsmith        2014-01-28 14:55:24.790    ENGL-101
susysweet       2014-01-29 14:55:24.737    ENGL-101
我需要做的是查看这些行,并且仅当一组
用户id
之间的
课程id
相同时,才将注册日期与行进行比较。例如,我会跳过前3个讲师的注册,因为他们的课程id不一样,所以我不必担心同一个班级有多个注册。我要查找的比较是最近的
注册日期
so
注册日期大于这些用户id之间相同课程id之前的任何其他注册日期

另一个问题是,我的select语句并不是简单地返回3行,正如我现在编写的那样,它返回901行,所以我需要查看这些结果,然后相应地更新内容

基本上,我要查找的查询将提供所需的比较,然后
更新课程\u用户将行\u状态设置为2,其中注册日期大于其他讲师中同一课程id的任何其他注册日期。

谢谢

根据以下答案修改查询:

Merge course_users AS T
Using (
    Select max(cu.enrollment_date) as EnrollDate, cm.course_id from course_users cu
join course_main cm on cu.crsmain_pk1 = cm.pk1
join users u on cu.users_pk1 = u.pk1
where cu.role = 'P' and cm.course_id like '%SP2014' group by cm.course_id
) As SRC ON SRC.Course_ID = T.crsmain_pk1 and SRC.EnrollDate != T.enrollment_date
WHEN MATCH 
THEN UPDATE SET T.row_status = 2;

匹配处接收不正确的语法
?它应该是匹配的吗?

您需要研究如何利用合并功能来执行此任务。这段代码是为了让你知道去哪里。您是该模式的专家,因此您将能够在course_users表中找出course_id

Merge course_users AS T
Using (
    Select max(cu.enrollment_date) as EnrollDate, cm.course_id from cte group by course
) As SRC ON SRC.Course_ID = T.Course_ID and SRC.EnrollDate != T.enrollment_date
WHEN MATCHED 
    THEN UPDATE SET T.row_status = 2;

这里是指向合并功能上的的的链接。

您使用的是什么版本的SQL Server?您所说的“之前的任何其他注册日期”是什么意思?哪一列指定了此顺序?不能是报名日期,因为这是一个同义反复。为了澄清,您希望更新上面的哪些记录?上面的记录没有显示在我的select语句中,但我将根据评估更新一个名为cu.row_status(课程_用户表)的列。我所说的“之前的任何其他报名日期”是指,我在一组课程id相同的讲师中查找最近的报名日期,然后,禁用在最近一个注册日期之前且也在同一课程中的任何其他注册日期的注册。是否介意发布一些表的架构?它将帮助我编写一些说服代码。我用正确的模式信息修改了代码,但是在MATCH语句中出现了关于“不正确语法”的错误。检查我的问题以了解我所做的修改。它是否应该是“匹配时”不匹配?查询几乎可以正常工作,但我需要一个条件来仅更新role=P的行_状态,使用我的查询禁用了每个用户帐户(当然,我是在具有备份的测试服务器上执行此操作)。有什么想法吗?匹配时语法确实是
。您可以在的ON条件之后添加
和role=P
SRC@NickyvV这是“匹配且角色=P”还是“在SRC.pk1=T.crsmain\u pk1和SRC.EnrollDate!=T.enrollment\u date和role=P上的SRC”在SRC条件的末尾?