2017-07-06 71 views
0

我有兩個表。
表1結構NOT NULL。
表2的某些值爲NULL。
我想要更新table2到table1
我希望當選擇值,如果null不更新,並跳過下一列有更新值。
sql select更新多列並在更新前檢查不爲空

我的表

table1  value(table1)  table2  value(table2) 
t1ID  1234    t2ID   1234 
t1Name  Bear    t2Name  null 
t1Adress 87/25    t2Adress  99/77 
t1Tel  01254798535  t2Tel  null 

我的代碼

UPDATE table1 
SET t1Name = (SELECT t2Name 
    FROM table2 
    WHERE t2Name IS NOT NULL 
    ), 
    t1Adress = (SELECT t2Adress 
    FROM table2 
    WHERE t2Adress IS NOT NULL 
    ), 
    t1Tel = (SELECT t2Tel 
    FROM table2 
    WHERE t2Tel IS NOT NULL 
    ) 
FROM table1,table2 
WHERE t1ID = '1234' AND t2ID ='1234' 

當我執行我得到錯誤:

SQL error : Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. The statement has been terminated.

我怎樣才能解決呢?

+0

@GordonLinoff謝謝更新休息。我現在可以標記。 –

回答

0

下面的查詢與表1的值代替空值,並從表2值

UPDATE T1 SET T1.t1Name = IsNull(T2.t2Name,T1.t1Name), 
       T1.t1Adress = IsNull(T2.t2Adress,T1.t1Adress), 
       T1.t1Tel = IsNull(T2.t2Tel,T1.t1Tel) 
     FROM table1 TI 
       INNER JOIN table2 T2 ON T1.t1ID = T2.t2ID 

嘗試下面的選擇查詢,以檢查你的結果

SELECT T1.t1Name,IsNull(T2.t2Name,T1.t1Name),T1.t1Adress,IsNull(T2.t2Adress,T1.t1Adress),T1.t1Tel,IsNull(T2.t2Tel,T1.t1Tel) 
     FROM table1 TI 
       INNER JOIN table2 T2 ON T1.t1ID = T2.t2ID 
2

我想你打算:

UPDATE t1 
    SET t1Name = COALESCE(t2.t2Name, t1.t1Name), 
     t1Adress = COALESCE(t2.t2Adress, t1.t1Adress), 
     t1Tel = COALESCE(t2.t2Tel, t1.t2Tel) 
    FROM table1 t1 JOIN 
     table2 t2 
     ON t1.t1id = t2.t2id 
    WHERE t1.t1ID = 1234; 

請注意,我取消了'1234'單引號。 Id通常是數字,所以他們應該與數字進行比較。

您的代碼失敗,因爲您使用子查詢而不是join中的值。您似乎在table2中有多個行,因此您得到的子查詢返回了多個行錯誤。

+0

謝謝,當我更新某些列類型是數字,如果拉值表格table2爲空,並更新到table1這個值不是空白,但是爲0. 如果我wank這個空白。 我該如何解決? –

+0

(1)你的問題沒有意義,因爲這些列都不應該是數字。 (2)你有沒有理由不接受答案? –

+0

其他人是創建數據庫的人。 他希望我更新數據。 舊錶可以在列中使用null,但新表結構不爲null。 而且他想要不是空列這個值顯示空白不是0 (類型值是數字), 但他不想改變結構。 我可以使用觸發器更新前檢查? –