使用另一个表中的一次使用值更新SQL Server表

时间:2014-12-03 21:54:46

标签: sql 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而不是任何编程来完成此操作。我很难过。

2 个答案:

答案 0 :(得分:0)

在桌面上为更新创建触发器,并使用插入已删除在其中执行您想要的操作

答案 1 :(得分:0)

我认为User表和Activity表之间存在多对多关系。

因此,您可以在更新时使用触发器执行查询。 每次在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代理作业)。