2016-07-27 37 views
1

我最近向其中一個表中添加了新列,需要包含來自另一列+ 365天的日期。單獨更新每條記錄是不可行的,我嘗試過的所有內容都不起作用。主要收到此錯誤:SQL使用存在的列數據更新新列上的所有行

子查詢返回的值超過1。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

我最近嘗試在下面編寫腳本。

UPDATE A SET A.enddate_dt = DATEADD(day,365,B.appdate_dt) 
FROM cd.mhc_appdiscfee A 
    INNER JOIN cd.mhc_appdiscfee B ON B.uniqueid_c = A.uniqueid_c 

enter image description here

+1

爲什麼不直接刪除列和計算SELECT查詢上即時的價值?或者使用觸發器 –

+0

JOIN的目的是什麼? – CodyMR

+0

在這個表上運行的查詢不是由我創建的,而是由創建我們軟件的第三方創建的(是的,我知道是正確的)。事實上,我已經創建了一個觸發器,用於添加到表中時自動創建的所有新值,但這會使我更改所有現有數據。至於JOIN,我從堆棧交換中的另一個腳本複製了它,我相信這是爲了讓子查詢找到唯一的結果並匹配它,因爲表是它自己的數據源。 – Romex

回答

1

首先一個小樣本,其中的功能工作正常。意味着你的數據有問題。

SQL DEMO

但是,如果你使用的是單個表,只需使用。 (IM使用int,而不是日期,我的樣品中)

UPDATE A SET A.[enddate_dt ] = DATEADD(day,365, A.[appdate_dt]) 
FROM Table1 A; 

enter image description here

+0

這傢伙是對的。我們關注的是加入聯盟的煙霧和鏡子,實際上聯盟應該永遠不會發揮作用。這是一個簡單的更新語句,使用行的列之一來設置另一行的列的值。案件結案 –

+0

@CharlesMcIntosh是的,我剛剛看到'A,B',並且認爲它們是不同的表格。 –

+0

好吧,看來我的問題是,事實上我創建了一個觸發器來添加enddate_dt,無論何時插入或更新表。讓觸發器並行運行我第一次嘗試的代碼,它與您的代碼非常相似,並且與Rich的代碼一起嘗試更新enddate_dt失敗,並顯示子查詢錯誤。禁用腳本並運行其中的任一代碼使其工作。特別選擇您的答案是正確的,因爲您花了大量時間提供幫助。 – Romex

1

這是告訴你,你的唯一ID不是唯一的。另外,這個數據在初始分配後會改變嗎?如果不是,您可以使用計算列。

+0

uniqueid_c字段上的數據確實是唯一的。我用非常像Juan Carlos發佈的腳本測試過它。 – Romex

+0

如果它在兩個表上都是唯一的,那麼您將不會收到此消息。如果這是一對多關係,那麼子表有可能是重複的,並且是消息的原因。 –

+0

要更新的表來源和表格是相同的。 – Romex

0

試試,看看那些是真正獨特

SELECT A.uniqueid_c, COUNT(*) 
FROM cd.mhc_appdiscfee A 
GROUP BY A.uniqueid_c 
HAVING COUNT(*) > 1 

而且

SELECT B.uniqueid_c, COUNT(*) 
FROM cd.mhc_appdiscfee B 
GROUP BY B.uniqueid_c 
HAVING COUNT(*) > 1 

編輯:

另一個測試

SELECT A.uniqueid_c, 
     B.uniqueid_c, 
     COUNT(*) 
FROM cd.mhc_appdiscfee A 
INNER JOIN cd.mhc_appdiscfee B 
    ON B.uniqueid_c = A.uniqueid_c; 
GROUP BY A.uniqueid_c, 
      B.uniqueid_c 
+0

這兩個都沒有返回結果,就像我的初始腳本測試,如果該字段確實是唯一的。這是我第一次想到,當我運行的查詢返回了太多的子查詢結果的值。 – Romex

+0

然後也許提供一個表格,你可以重現錯誤的小樣本。嘗試使用sqlFiddle.com。我還包括另一個測試。但應該是一樣的。 –

0

我在這裏錯過了什麼?當然你可以這樣做:

Update cd.mhc_appdiscfee set enddate_dt = DATEADD(day,365, appdate_dt)