2012-08-06 53 views
0

如果表中的某個值發生更改,我需要從SQL數據庫中選擇一條語句。根據列的值是否更改從SQL數據庫中拉取一行

例如,我在Price表中有一列名爲price的列。如果用戶更改price的值(通過asp.net應用程序),我想選擇整行。這將在工作流程中完成,並向用戶發送一封電子郵件,該電子郵件發生更改後被更改的行。

這是否有意義?有人能指出我正在使用某個程序或功能的正確方向嗎?謝謝。

+0

什麼是您的數據是什麼樣子?價格是歷史表嗎?如果它是一個歷史記錄表什麼是主鍵,什麼是確定之前和之後的什麼是日期字段? – 2012-08-06 20:02:42

+0

有沒有這樣的事情作爲** SQL數據庫** --- * * SQL *只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是**數據庫產品本身。這將真正有助於知道你正在使用的實際的**數據庫系統**(以及哪個版本).... – 2012-08-06 20:25:20

回答

0

好吧,爲了更新一行,你必須更新那行「WHERE uniqueID = [someid]」。你不能簡單地在那之後運行一個選擇嗎? (SELECT * FROM [table] WHERE uniquueID = [someid])

+0

工作流程在夜間工作中運行。我需要在不同的存儲過程中運行選擇。 – Jeff 2012-08-06 19:56:44

+0

好的,那麼我會添加一個「LastModified」(或任何最適用的名稱)日期字段,並在更改時更新它。然後你的其他SP可以更新自「X」日期以來更新的那些SP。 – Losbear 2012-08-06 20:34:54

1

您可以使用SQL觸發器來完成此操作。

有,說明如何做到這一點這裏的教程(使用像你描述的價格):http://benreichelt.net/blog/2005/12/13/making-a-trigger-fire-on-column-change/

+0

這看起來是最容易做的事情。有兩張桌子連在一起。價格在鏈接到跟蹤表的合同表上。如果根據從其他表格中加入的信息更新價格,我需要從兩個表格中獲取信息。這觸發器甚至可能嗎? – Jeff 2012-08-06 21:01:01

+0

我可以將這些數據放入視圖中,然後在視圖上放置一個觸發器嗎? – Jeff 2012-08-06 21:04:40

0

不知道你的數據是什麼樣子(或這是什麼數據庫,這是一個有點困難),但假設你有一個日期和保持這樣相同的ID歷史表...

+----+-------+------------+ 
| ID | PRICE | CHNG_DATE | 
+----+-------+------------+ 
| 1 | 2.5 | 2001-01-01 | 
| 1 | 42 | 2001-01-01 | 
| 2 | 4  | 2001-01-01 | 
| 2 | 4  | 2001-01-01 | 
| 3 | 4  | 2001-01-01 | 
| 3 | 3  | 2001-01-01 | 
| 3 | 2  | 2001-01-01 | 
+----+-------+------------+ 

和你的數據庫支持WithRow_number你可以寫下面

WITH data 
    AS (SELECT id, 
       price, 
       chng_date, 
       Row_number() 
        OVER ( 
        partition BY id 
        ORDER BY chng_date) rn 
     FROM price) 
SELECT data.id, 
     data.price  new, 
     data_prv.price old, 
     data.chng_date 
FROM data 
     INNER JOIN data data_prv 
       ON data.id = data_prv.id 
        AND data.rn = data_prv.rn + 1 
WHERE data.price <> data_prv.price 

如果你的數據庫支持LAG()這將產生這種

+----+-----+-----+------------+ 
| ID | NEW | OLD | CHNG_DATE | 
+----+-----+-----+------------+ 
| 1 | 42 | 2.5 | 2001-01-01 | 
| 3 | 3 | 4 | 2001-01-01 | 
| 3 | 2 | 3 | 2001-01-01 | 
+----+-----+-----+------------+ 

Demo

它甚至eaiser

WITH data 
    AS (SELECT id, 
       price     new, 
       chng_date, 
       Lag(price) 
        OVER ( 
        partition BY id 
        ORDER BY chng_date) old 
     FROM price) 
SELECT id, 
     new, 
     old, 
     chng_date 
FROM data 
WHERE new <> old 

Demo

相關問題