2011-08-25 31 views
0

首先我对SQL比较陌生,所以尽管我相信在这个线程中提出了一个类似的问题(SQL Query - Copy Values in Same Table),但我实际上不能很好地理解这些信息。为此我表示歉意。如何将同一个表中的多个值复制到SQL中同一表中的其他值?

现在,我有一个表,看起来是这样的:

company id | parameter name | parameter title 
    P  | Parameter One | First Parameter 
    P  | Parameter Two | Second Parameter 
    P  | Parameter Three| Third Parameter 
    W  | Parameter One | NULL 
    W  | Parameter Two | NULL 

除了我的桌子显然有相当多的行。我已经填写了公司ID为'P'的所有参数标题,并且希望避免手动为公司标识为'W'的人员做相同的标题。我的问题是,我可以使用什么SQL语句(这是在Microsoft SQL Server 2008中)将公司标识为'P'的列“参数标题”中的值复制到公司标识为' W'和两个参数名称匹配(W的参数比P少)?

使用以前链接的线程我能想出以下,但它吐出了一个错误,我知道这是不正确完成:

UPDATE COMP_PARAMETER_COPY 
SET PARAM_TITLE=(SELECT PARAM_TITLE FROM COMP_PARAMETER_COPY P 
      WHERE P.COMP_ID = 'P' AND P.PARAM_TITLE=PARAM_TITLE) 
WHERE COMP_ID='W' 

(我用的副本打转转该表而不是实际的表)

我得到的错误是“Msg 512,Level 16,State 1,Line 1 子查询返回的值超过1,当子查询跟随=,!=, <,< =,>,> =或当子查询用作表达式时 st呕吐已终止。“

谢谢您的帮助和建议, -Asaf

+0

可能重复的[SQL查询 - 在同一表中复制值](http://stackoverflow.com/questions/1400245/sql-query-copy-values-in-same-table) –

回答

1

你需要确保你的子查询只返回一个结果。现在,该错误消息告诉你,你正在返回多条记录。

UPDATE W 
SET PARAM_TITLE = (
         SELECT PARAM_TITLE FROM COMP_PARAMETER_COPY P 
         WHERE P.COMP_ID = 'P' AND P.PARAM_NAME = W.PARAM_NAME 
        ) 
FROM COMP_PARAMETER_COPY W 
WHERE W.COMP_ID = 'W' 

尝试给上述SQL一个旋风。这仍然可以给你多个结果,但是不知道你的表是什么样子的,以及数据约束是什么,很难给你保证工作的东西。

+0

这样做了!非常感谢! – Asaf

+0

在SQL中......它如何知道“W”是指什么?我只是想了解背后的编程逻辑。 – Asaf

+1

@Asaf - 您可以将其视为范围问题,就像您选择的编程语言中的对象具有范围一样。表别名W可以在该子查询中使用,因为它具有更大的范围。表别名P不能在括号之外使用,因为其范围仅限于子查询。这有帮助吗? –

0

尝试添加DISTINCT关键字查询:

UPDATE COMP_PARAMETER_COPY 
SET PARAM_TITLE=(SELECT DISTINCT PARAM_TITLE FROM COMP_PARAMETER_COPY P 
      WHERE P.COMP_ID = 'P' AND P.PARAM_TITLE=PARAM_TITLE) 
WHERE COMP_ID='W' 
+0

嗯,它不更改该子查询的输出。 P.COMP_ID ='P'的值已经是唯一的/独特的... – Asaf

相关问题