Sql 基于同一表中特定记录的计数更新表
我正在使用Microsoft SQL Server,我的数据库中有一个如下表:Sql 基于同一表中特定记录的计数更新表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用Microsoft SQL Server,我的数据库中有一个如下表: Id groupName flag type -------------------------------- 1 aaa 0 0 2 aaa 1 0 3 aaa 0 0 4 bbb 0 0 5 bbb 0
Id groupName flag type
--------------------------------
1 aaa 0 0
2 aaa 1 0
3 aaa 0 0
4 bbb 0 0
5 bbb 0 0
6 bbb 0 0
我想根据同一个表中特定记录的计数来更新类型列的值
假设记录按其groupName分组,如果组中至少有一条记录的标志为1,则同一组中所有记录的TypeValue应为1,否则为0
在我的例子中,我希望得到以下输出
Id groupName flag type
--------------------------------
1 aaa 0 1
2 aaa 1 1
3 aaa 0 1
4 bbb 0 0
5 bbb 0 0
6 bbb 0 0
如何使用SQL语句实现这一点
编辑
当然,下面的方法行不通
UPDATE t1
SET type = CASE
WHEN ((SELECT COUNT(*) FROM tg) > 0)
THEN 1
ELSE 0
END
FROM [sampleDB].[dbo].[groups] t1
JOIN (SELECT t2.groupName, t2.flag
FROM [sampleDB].[dbo].[groups] t2) tg ON tg.groupName = t1.groupName
AND tg.flag = 1;
这是使用exists语句解决此问题最有效的方法:
update t1
set type = 1
from table t1
where exists ( select 1
from table t2
where t1.groupname = t2.groupname
and flag = 1
)
这是使用exists语句解决此问题最有效的方法:
update t1
set type = 1
from table t1
where exists ( select 1
from table t2
where t1.groupname = t2.groupname
and flag = 1
)
你可以试试下面的方法-
UPDATE t
SET
type = case when cnt>=1 then 1 else 0 end
FROM
tablename t
INNER JOIN (select group_name, count(case when flag=1 then 1 end) as cnt from tablename
group by group_name)t1
ON t.group_name= t1.group_name
你可以试试下面的方法-
UPDATE t
SET
type = case when cnt>=1 then 1 else 0 end
FROM
tablename t
INNER JOIN (select group_name, count(case when flag=1 then 1 end) as cnt from tablename
group by group_name)t1
ON t.group_name= t1.group_name
您只需使用简单的联接即可:
UPDATE D
SET Type = 1
FROM Data D JOIN
(
SELECT GroupName
FROM Data
WHERE Flag = 1
) T ON D.GroupName = T.GroupName;
下面是一个您可以通过使用简单的连接来实现:
UPDATE D
SET Type = 1
FROM Data D JOIN
(
SELECT GroupName
FROM Data
WHERE Flag = 1
) T ON D.GroupName = T.GroupName;
这里有一个这可能是另一个选项
;with data
As (
Select count(groupname) groupname
,max(flag) flag
,type
From Tablename
Group by type
Having count(groupname)>1
And max(flag)=1
)
Update c
Set type =1
From data c
这可能是另一种选择
;with data
As (
Select count(groupname) groupname
,max(flag) flag
,type
From Tablename
Group by type
Having count(groupname)>1
And max(flag)=1
)
Update c
Set type =1
From data c
我将使用窗口功能:
with toupdate as (
select g.*, max(flag) over (partition by groupname) as new_flag
from [sampleDB].[dbo].[groups] g
)
update toupdate
set flag = new_flag
where flag <> new_flag;
请注意where子句,因此仅更新标志正在更改的行。即使值没有更改,SQL Server也会尝试更新行,从而导致开销。where子句节省了大部分开销。我将使用窗口函数:
with toupdate as (
select g.*, max(flag) over (partition by groupname) as new_flag
from [sampleDB].[dbo].[groups] g
)
update toupdate
set flag = new_flag
where flag <> new_flag;
请注意where子句,因此仅更新标志正在更改的行。即使值没有更改,SQL Server也会尝试更新行,从而导致开销。where子句节省了大部分开销。@Dale K以下内容不起作用。当从tg>0中选择COUNT*时更新t1 SET type=CASE,然后从[sampleDB].[dbo].[groups]t1从[sampleDB].[dbo].[groups]t2 tg从tg.groupName=t1.groupName和tg.flag=1中选择t2.groupName和t2.flag@Dale K以下内容不起作用。当从tg>0中选择COUNT*时更新t1 SET type=CASE,然后从[sampleDB].[dbo].[groups]t1从[sampleDB].[dbo].[groups]t2 tg从tg.groupName=t1.groupName和tg.flag=1中选择t2.groupName和t2.flag;谢谢你的快速回复。这对我来说非常有效!!我被卡住了,因为我不明白当flag=1然后1结束时如何使用countcase。你教了我正确的用法。谢谢你的快速回复。这对我来说非常有效!!我被卡住了,因为我不明白当flag=1然后1结束时如何使用countcase。你教了我正确的用法。请不要只发布代码作为答案,还要解释你的代码的作用以及它是如何解决问题的。带有解释的答案通常更有帮助,质量更好,并且更有可能吸引更多的投票。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。