2016-12-26 52 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