我有下表,我称之为'示例'
id name last_name
01 Adam Adams
02 Bill Billo
03 Cathy McCathyson
我需要修改表格并最终得到以下内容:
id name
01 Adam Adams
02 Bill Billo
03 Cathy McCathyson
对于单行,我知道如何编写此查询:
UPDATE example SET name =
(SELECT name FROM example WHERE id = 01)+" "
+(SELECT last_name FROM example WHERE id = 01)
WHERE id = 01;
如何修改此查询,以便使用该行的值更新每一行,如示例所示?
编辑:我已经更新了我的示例,因为它混淆了这个问题。
答案 0 :(得分:9)
UPDATE example SET NAME = NAME + ' ' + last_name
ID NAME LAST_NAME
1 Adam Adams
2 Bill Billo
3 Cathy McCathyson
SQL> UPDATE example SET NAME = NAME + ' ' + last_name
2 /
3 rows updated
SQL> select * from example
2 /
ID NAME LAST_NAME
---------- -----------------------------------------
1 Adam Adams Adams
2 Bill Billo Billo
3 Cathy McCathyson McCathyson
答案 1 :(得分:7)
您可能需要考虑将其添加为computed column。这样,该列是虚拟的,因此您不会使用额外的存储空间。此外,对name或last_name的任何更改都会自动反映在新列中,而无需任何干预。
编辑:根据示例中的更改修改了代码。
alter table example
add full_name as coalesce(name+' ','') + last_name
答案 2 :(得分:4)
注意:这个答案是基于问题的第一个问题。相同的一般原则适用于修订版本,因此我没有更新列名以保持同步。
@ n8wrl在评论中提出了一个很好的问题,但回答了你的问题(假设颜色和文字都是字符数据,所以不需要任何演员)。
此外,我假设非列可以为空。如果它们然后连接NULL
将产生NULL
,假设您有ANSI默认选项。如果这不是所需的行为,则需要使用ISNULL(color,'')
等。
DECLARE @example table
(
id int NOT NULL,
color char(6) NOT NULL,
text varchar(100) NOT NULL
)
insert into @example
SELECT 01, '990000', 'Red' UNION ALL
SELECT 02, '009900', 'Green' UNION ALL
SELECT 03, '000099', 'Blue'
UPDATE @example SET text = '<span style=''color: #'
+color+'''>'
+text+'</span>'
/*WHERE id = 01;*/
SELECT * FROM @example
我不得不说我怀疑以这种格式存储它是一个好主意。这意味着您将存储大量冗余字符,这意味着更少的行将适合数据页面,更大的I / O和更低效的内存使用