2014-12-03 70 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

相關問題