Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果SQL Server中的ID、日期和金额值重复,如何在列中设置默认值?_Sql Server_Tsql - Fatal编程技术网

Sql server 如果SQL Server中的ID、日期和金额值重复,如何在列中设置默认值?

Sql server 如果SQL Server中的ID、日期和金额值重复,如何在列中设置默认值?,sql-server,tsql,Sql Server,Tsql,我使用的是SQL Server 2017版本 如果ID、日期和金额值重复,我希望将列默认为特定值 示例:如果在下表中看到ID,则日期和金额值是重复的,基于此,我需要将优先级值默认为Priority1 我用了下面的说法, UPDATE TABLE T SET PRIORITY = 'Priority 1' GROUP BY T.PRIORITY WHERE ID = (SELECT ID FROM T GROUP BY ID HAVING COUNT(ID)>1) and DATE =

我使用的是SQL Server 2017版本

如果ID、日期和金额值重复,我希望将列默认为特定值

示例:如果在下表中看到ID,则日期和金额值是重复的,基于此,我需要将优先级值默认为Priority1

我用了下面的说法,

UPDATE TABLE T
SET PRIORITY = 'Priority 1'
GROUP BY T.PRIORITY
WHERE ID =  (SELECT ID FROM T
GROUP BY ID HAVING COUNT(ID)>1)
and DATE =  (SELECT DATE FROM T
GROUP BY DATE HAVING(COUNT (DATE))>1)
and AMOUNT =  (SELECT AMOUNT FROM T
GROUP BY AMOUNT HAVING(COUNT (AMOUNT))>1) 
它返回了以下错误

消息512,16级,状态1,第6行 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。 声明已终止


请提供任何建议。

如果不希望有重复的值,请创建一个唯一的约束,并将工作留给SQL Server。然后,您可以捕获SQL Server、.net或其他语言中的错误,并通知用户无法插入重复记录

这比让用户认为数据已提交但实际上数据已转换更方便

如果需要计算重复项,请添加计数器列


如果您的业务逻辑需要这样的行为,您可以查看并创建,而不是插入、更新触发器,它基本上允许您在提交更改之前执行T-SQL代码。您可以在那里查找重复项,如果存在重复项,则可以修改值并将其插入。

为什么不将其设置为插入的一部分:

declare @Id int, @Date date, @Amount money, @Piority varchar(12);

insert into dbo.MyTable (id, [Date], Amount, Prority)
    select @Id, @Date, @Amount, case when exists (select 1 from dbo.MyTable where id = @Id and [Date] = @Date and Amount = @Amount) then 'Priority 1' else @Priority end;
否则,请查找重复的行并更新它们:

update T set
    [Priority] = 'Priority1'
from dbo.MyTable T
inner join (
    select id, [Date], Amount
    from dbo.MyTable
    group by id, [Date], Amount
    having count(*) > 1
) D on D.id = T.id and T.[Date] = D.[Date] and T.Amount = D.Amountl

我尝试了一个案例,并更新了一些语句,但我无法拿出一个可靠的逻辑来让它工作。更新是手动完成的,主要目的是查找重复的ID,日期和金额记录,默认优先级值为最高值。我使用了以下更新语句更新表T SET priority='priority 1'GROUP BY T.priority,其中ID=从COUNTID>1的T GROUP BY ID中选择ID,日期=从COUNTID Date>1的T GROUP BY日期中选择日期,金额=从T GROUP BY AMOUP中选择金额HAVINGCOUNT AMOUNT>1并返回以下错误,Msg 512,级别16,状态1,第6行子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。该语句已被终止。Hello Dale,我在表中有大约9个字段和近10k条记录,我只是以其中一些字段为例,我可以使用您提供的相同代码吗?我的表格有更多的字段和更多的记录,这样做行吗?首先,请确保您的问题准确反映您的问题。第二,你为什么把你的尝试从你的问题中删掉?第三,你需要理解我写的问题是什么,然后你才能回答你自己的问题。请不要运行您不理解的代码。如果你需要帮助理解它,那就去问吧。我错误地删除了代码,谢谢你的建议,我想我得到了我需要的。
update T set
    [Priority] = 'Priority1'
from dbo.MyTable T
inner join (
    select id, [Date], Amount
    from dbo.MyTable
    group by id, [Date], Amount
    having count(*) > 1
) D on D.id = T.id and T.[Date] = D.[Date] and T.Amount = D.Amountl