如何使用sql查询语句处理关于表的某项数据更新的问题(问题内详)
假设目前我有一个表A:
其中表A如下
id name
001 李
002 王
003 罗
(更新前的表A)
现在,我要更新表A中id=001的name的数据
并且定义一个int类型的变量@b,并将@b初始化为1
当@b<一个指定的函数,假设为3时,持续更新表A中id=001的name的数据
如果我要将表A更新后的数据为如下,那用sql查询语句应该怎么写?
更新后的表A:
id name
001 李1
001 李2
001 李3
002 王
003 罗
(更新后的表A)
如果只能使用一次table函数,这个问题应该如何解决?
------解决方案--------------------你的需求,当参数大于已有的记录数时,只通过更新是实现不了,除了更新已有的数据,还需要插入新数据
------解决方案--------------------自己构造函数
------解决方案--------------------你这个所谓的更新更多是插入吧?如果要做,那先要判断表中现有数量,然后和你的参数比较,只有小于等于的情况下才进行操作,另外如果你要这样做的话,每次循环都要判断哦,因为当你插入新数据的时候,数量又多了一条。又要重新判断。你得需求是想实现什么?或者说这是什么类型的应用,看看有没有别的方法来实现。
------解决方案--------------------1、其实不应该有完全一样的数据,这违反了关系数据库理论。你的相同数据应该是某些字段而已。
2、找出不相同的数据方法有很多,比如用exists、用except等等,你找到了,再筛选top1就可以拉
------解决方案--------------------是不奇怪,但是不应该。你想想如果允许这样的数据存在的话:
1、查询的时候怎么办?不能每次都distinct吧?
2、更新的时候才是头疼的。
3、这是不合理的冗余,占了空间,也没意义。
所以强烈建议每个表都要有一个主键,无论是复合的还是但主键。
------解决方案--------------------delete from @ta where name=@b3+CONVERT(char(1),@i)
下加一条
delete from @ta where name=@b4+CONVERT(char(1),@i)
------解决方案--------------------根据你的思路我也写了一段代码
SQL code
CREATE TABLE t(id VARCHAR(20),[name] VARCHAR(20))
INSERT INTO t
SELECT '001','张三'
UNION
SELECT '002','李四'
GO
IF EXISTS (SELECT 1 FROM sys.objects WHERE NAME = 'f_csdn')
DROP FUNCTION f_csdn
GO
create FUNCTION [dbo].[f_csdn]
(
@id VARCHAR(20),
@num int
)
RETURNS
@tmp TABLE
(
id VARCHAR(20),
[name] VARCHAR(20)
)
AS
BEGIN
DECLARE @name AS VARCHAR(20);
IF EXISTS (SELECT 1 FROM t WHERE id = @id)
SELECT TOP 1 @name= [Name] FROM t WHERE id = @id
ELSE
RETURN;
WHILE @num >= 1
BEGIN
INSERT INTO @tmp VALUES(@id,@name+RTRIM(LTRIM(str(@num))))
set @num = @num -1
END
RETURN
END
GO
SELECT * FROM T
UNION
SELECT * FROM f_csdn('001',3)
GO
DROP TABLE t
DROP FUNCTION f_csdn
GO