Sql 根据以下规则从表中删除记录
规则1:在Yearquarter中使用如果有多行status='a'和i类型,则不应删除该Yearquarter中的任何行 规则2:如果在Yearquarter中有一行status='a'和类型3,4,并且所有其他行具有不同的状态和类型,我们需要删除所有这些行 而yearquarter应该保留一行类型为3,4的status='a' 这是emp表Sql 根据以下规则从表中删除记录,sql,sql-server,Sql,Sql Server,规则1:在Yearquarter中使用如果有多行status='a'和i类型,则不应删除该Yearquarter中的任何行 规则2:如果在Yearquarter中有一行status='a'和类型3,4,并且所有其他行具有不同的状态和类型,我们需要删除所有这些行 而yearquarter应该保留一行类型为3,4的status='a' 这是emp表 +-------+-------------+------+--------+ | EMPID | YEARQUARTER | TYPE | STATU
+-------+-------------+------+--------+
| EMPID | YEARQUARTER | TYPE | STATUS |
+-------+-------------+------+--------+
| 105 | 20021 | 3 | A |
| 105 | 20021 | 1 | B |
| 106 | 20031 | 3 | A |
| 107 | 20101 | 4 | A |
| 107 | 20101 | 2 | B |
| 107 | 20101 | 2 | B |
| 108 | 20111 | 5 | B |
| 108 | 20111 | 1 | B |
| 108 | 20111 | 4 | A |
| 109 | 20131 | 3 | A |
| 109 | 20131 | 1 | A |
| 109 | 20131 | 2 | B |
+-------+-------------+------+--------+
删除后
EMP表应留有
输出
+-------+-------------+------+--------+
| EMPID | YEARQUARTER | TYPE | STATUS |
+-------+-------------+------+--------+
| 105 | 20021 | 3 | A |
| 106 | 20031 | 3 | A |
| 107 | 20101 | 4 | A |
| 108 | 20111 | 4 | A |
| 109 | 20131 | 3 | A |
| 109 | 20131 | 1 | A |
| 109 | 20131 | 2 | B |
+-------+-------------+------+--------+
我正在尝试使用
但是它给出了错误,并且没有显示期望的结果
DELETE e1
Emp e1
WHERE
E1.[type] IN (3,4)
AND EXISTS (
SELECT
*
FROM
Emp e2
WHERE
e1.EMPID = e2.EMPID
AND e1.yearquarter = e2.yearquarter
AND e2.[status] = 'A'
)
可以为每个规则使用不同的子查询
declare @temp table (
EMPID int,
YEARQUARTER int,
[TYPE] int,
[STATUS] CHAR(1)
)
insert into @temp
select 105, 20021 , 3 ,'A' union
select 105, 20021 , 1 ,'B' union
select 106, 20031 , 3 ,'A' union
select 107, 20101 , 4 ,'A' union
select 107, 20101 , 2 ,'B' union
select 107, 20101 , 2 ,'B' union
select 108, 20111 , 5 ,'B' union
select 108, 20111 , 1 ,'B' union
select 108, 20111 , 4 ,'A' union
select 109, 20131 , 3 ,'A' union
select 109, 20131 , 1 ,'A' union
select 109, 20131 , 2 ,'B'
delete from @temp
where YEARQUARTER in (
select
YEARQUARTER
from @temp
where [STATUS]='A'
and type in (3,4)
group by YEARQUARTER
HAVING COUNT(*) = 1
)
and YEARQUARTER not in (
select
YEARQUARTER
from @temp
where [STATUS]='A'
group by YEARQUARTER
HAVING COUNT(*) > 1)
and ([STATUS]<>'A'
and type not in (3,4))
select * from @temp
可以为每个规则使用不同的子查询
declare @temp table (
EMPID int,
YEARQUARTER int,
[TYPE] int,
[STATUS] CHAR(1)
)
insert into @temp
select 105, 20021 , 3 ,'A' union
select 105, 20021 , 1 ,'B' union
select 106, 20031 , 3 ,'A' union
select 107, 20101 , 4 ,'A' union
select 107, 20101 , 2 ,'B' union
select 107, 20101 , 2 ,'B' union
select 108, 20111 , 5 ,'B' union
select 108, 20111 , 1 ,'B' union
select 108, 20111 , 4 ,'A' union
select 109, 20131 , 3 ,'A' union
select 109, 20131 , 1 ,'A' union
select 109, 20131 , 2 ,'B'
delete from @temp
where YEARQUARTER in (
select
YEARQUARTER
from @temp
where [STATUS]='A'
and type in (3,4)
group by YEARQUARTER
HAVING COUNT(*) = 1
)
and YEARQUARTER not in (
select
YEARQUARTER
from @temp
where [STATUS]='A'
group by YEARQUARTER
HAVING COUNT(*) > 1)
and ([STATUS]<>'A'
and type not in (3,4))
select * from @temp
因此,对于给定的YearQuarter,如果有且只有一行状态为“a”并键入3,4,则删除该YearQuarter的所有其他行?我们不应删除该行。您是否可以在一个YearQuarter中拥有多条状态为a且键入3或4的记录?这是一个错误。分享这个错误信息会有很大帮助。你错过了第2行的关键词;可能是这导致了错误?因此,对于给定的YearQuarter,如果有且只有一行状态为“a”并键入3,4,则删除该YearQuarter的所有其他行?我们不应删除该行。您是否可以在一个YearQuarter中拥有多条状态为a且键入3或4的记录?这是一个错误。分享这个错误信息会有很大帮助。你错过了第2行的关键词;也许这就是错误的原因?
+-------+-------------+------+--------+
| EMPID | YEARQUARTER | TYPE | STATUS |
+-------+-------------+------+--------+
| 105 | 20021 | 3 | A |
| 106 | 20031 | 3 | A |
| 107 | 20101 | 4 | A |
| 108 | 20111 | 4 | A |
| 109 | 20131 | 1 | A |
| 109 | 20131 | 2 | B |
| 109 | 20131 | 3 | A |
+-------+-------------+------+--------+