2016-12-26 54 views
0

我只有1列(p_id),這在表TableaTableb中都是常見的。如何從Tablea更新Tableb中的列而不使用另一列作爲標識?

Tablea,p_id值是101到109,並且在Tableb,p_id值爲空。

我需要更新Tablebp_idTableap_id值。

我該怎麼做?

我已經運行下面的查詢,但它並沒有另一個身份列工作:

update tableb set pid=(select tablea.pid from tablea) where tableb.id between 1 and 9; 

,並返回以下錯誤消息:

消息512,級別16,狀態1 ,第197行子查詢返回的值超過1 。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。該語句已終止。

存在Tableb另一列ID其中包含的值從1到9

+0

錯誤說明了這一切,你正試圖給'tableb'的pid設置多於'1'的值。 –

+2

表之間是否存在關係?如果是這樣,請提及它。 –

+0

是的,tableb中的p_id用作外鍵。我想更新tableb p_id在tableb p_id –

回答

1

嘗試像下面

架構如你所說:

CREATE TABLE #TABLE_A (PID INT) 

INSERT INTO #TABLE_A 
SELECT 101 
UNION ALL 
SELECT 102 
UNION ALL 
SELECT 103 
UNION ALL 
SELECT 104 
UNION ALL 
SELECT 105 
UNION ALL 
SELECT 106 
UNION ALL 
SELECT 107 
UNION ALL 
SELECT 108 
UNION ALL 
SELECT 109 


CREATE TABLE #TABLE_B (ID INT, PID INT) 

INSERT INTO #TABLE_B 
SELECT 1, NULL 
UNION ALL 
SELECT 2, NULL 
UNION ALL 
SELECT 3, NULL 
UNION ALL 
SELECT 4, NULL 
UNION ALL 
SELECT 5, NULL 
UNION ALL 
SELECT 6, NULL 
UNION ALL 
SELECT 7, NULL 
UNION ALL 
SELECT 8, NULL 
UNION ALL 
SELECT 9, NULL 

現在有了更新的表-B下面類似的語句

UPDATE #TABLE_B SET #TABLE_B.PID = T_A.PID 
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) SNO , PID FROM #TABLE_A 
)AS T_A 
INNER JOIN (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) SNO , ID, PID FROM #TABLE_B 
)AS T_B ON T_A.SNO = T_B.SNO 
WHERE #TABLE_B.ID = T_B.ID 

方法2:不過硬編碼

UPDATE #TABLE_B SET #TABLE_B.PID = A.PID 
FROM #TABLE_A A 
INNER JOIN #TABLE_B B ON A.PID-100 = B.ID 
+0

方法2與我的類似,但沒關係。 – Susang

+0

我沒有看到你的答案,當我試一試。抱歉。 @Suraz –

+0

方法2不起作用,但行被影響,但在檢查狀態時它仍然爲空。 –

1

我們可以做到這一點簡單地從JOIN,它將從tableA

更新NULLpid s此解決方案是數據具體和我們不得不增加一些價值有join的解決方案

UPDATE b SET b.pid = a.pid 
FROM tableB b 
INNER JOIN tableA a ON a.pid = b.id+100 
WHERE b.pid IS NULL 

我覺得PID是空的ID 1 to 9所以在上面的代碼將檢查NULL值,並相應更新,但如果你不想更新所有NULL值,則可以在WHERE作爲

AND b.id between 1 and 9; 
添加條件

請嘗試更新上面的一個。

+0

hi @suraz它不適用於我 –

+0

@JasonClark請嘗試最後一個更新查詢。 – Susang