2014-12-03 44 views
1

我有一个拥有通常嫌疑犯,姓名,电子邮件等的用户表。当用户完成一项活动(从另一个表中查询)时,我需要授予他们是礼品卡的代码。使用一次性使用另一个表中的值更新SQL Server表

update users 
set giftcardcode = 'code from other table' 
where email in (select email from useractivity where necessary conditions are met) 

我有一个独特的礼品卡代码表,这是唯一的一次性使用代码。因此,我需要更新我的用户表,将奖励代码字段设置为等同于礼品卡代码表中不同的未使用的礼品卡代码。然后我需要将礼品卡表中的'used'字段标记为'Y'。

目标是用SQL做这件事,而不是任何编程。我很难过。

+1

确实sql脚本计数编程? – Steve 2014-12-03 21:58:03

+0

如果可以在SQL服务器内完成,那很好。我只是在寻找一种不会导致我不得不用另一种语言编写脚本的解决方案。 – edvan22 2014-12-03 22:25:14

回答

0

我觉得这是一个许多人用户表和活动表之间的多对多关系。

因此,您可以使用触发器在更新时执行查询。 每次在Activity表中更新一行时,触发器都会执行一些操作。 它将通过添加新的礼物代码来更新用户表。

我想你可以在你的GiftCode表中添加一个属性来轻松地检查代码是否已经被使用。你可以得到一个这样的未使用的代码:

// Retrieve an unused code based on a BIT attribute. 
SELECT TOP 1 [Code] FROM [GiftCode] WHERE IS_UNUSED = 1; 

不要忘记使用它后更新此礼品代码。

您可以使用SELECT语句包括子SELECT语句得到一个代码太:

// Retrieve an unused code based on User table used codes. 
SELECT TOP 1 [Code] FROM [GiftCode] WHERE [Code] NOT IN (SELECT [Code] FROM [User]); 

它运作良好,如果你没有太多的用户。否则,第一个陈述将会更有效率。 不要忘记更新用户表。

现在,您可以在UPDATE语句中轻松使用前面的这些语句之一。 这将是类似的东西:

UPDATE [User] SET [Code] = (
    SELECT TOP 1 [Code] FROM [GiftCode] WHERE [Code] NOT IN (
     SELECT [Code] FROM [User])) 
WHERE USER_ID = // ...; 

您可以在触发器执行此。

您可以使用stored procedure,它更高效,并将所有SQL代码包装在编译函数中。然后你可以在你的触发器中调用它。 您也可以在作业中执行存储过程(请参阅SQL Server代理作业)。

+0

我正在通过此解决方案。有一件事我应该提到,这些表格并没有被更新。数据从系统导出并导入到我的数据库中。我需要循环 - 对于满足要求的每个人,分配一个代码...我不确定触发器是否能够实现这一点。我可以多次执行SP吗? – edvan22 2014-12-04 22:21:06

+0

是的,你可以。您也可以使用循环创建存储过程。如果您不想实时更新,则可以在计划任务中执行存储过程。我认为SP是最好的方法,也是最容易定制的,因为您使用参数,循环等创建函数。 – K4timini 2014-12-04 23:39:18

0

你的桌子上创建一个触发更新,做你想要的东西里面使用插入删除

+0

显然所有的OP请求是更新 – Steve 2014-12-03 22:01:05

相关问题