Sql 如果表在yearquarter中至少没有一行所需状态,则尝试从表中删除记录
这是我的桌子Sql 如果表在yearquarter中至少没有一行所需状态,则尝试从表中删除记录,sql,sql-server,Sql,Sql Server,这是我的桌子 empid yearquarter status price 101 20011 A 30 101 20011 A 40 102 20021 A 80 103 20021 A 90 103 20021 A 100 104 20031 B 20 104 20031
empid yearquarter status price
101 20011 A 30
101 20011 A 40
102 20021 A 80
103 20021 A 90
103 20021 A 100
104 20031 B 20
104 20031 A 50
删除后
EMP表应留有
输出
empid yearquarter status price
104 20031 B 20
104 20031 A 50
如果表没有状态,则在YEARQUARTER中使用class='B'需要删除它们
我正在尝试使用
delete from EMP where status not in ('a')
group by yearquarter
但是它给出了错误并且没有显示所需的结果您不能将
GROUP BY
子句与DELETE
语句结合使用
您可能希望使用嵌套的不在子句,例如:
DELETE
FROM EMP
WHERE YEARQUARTER NOT IN (
SELECT YEARQUARTER
FROM EMP
WHERE STATUS = 'B'
)
不能将GROUP BY
子句与DELETE
语句结合使用
您可能希望使用嵌套的不在子句,例如:
DELETE
FROM EMP
WHERE YEARQUARTER NOT IN (
SELECT YEARQUARTER
FROM EMP
WHERE STATUS = 'B'
)
这应该符合你的要求
IF OBJECT_ID('tempdb..#Emp', 'U') IS NOT NULL
DROP TABLE #Emp;
CREATE TABLE #Emp (
empid INT NOT NULL,
yearquarter INT NOT NULL,
[status] CHAR(1) NOT NULL,
price MONEY NOT NULL
);
INSERT #Emp (empid, yearquarter, status, price) VALUES
(101, 20011, 'A', 30),
(101, 20011, 'A', 40),
(102, 20021, 'A', 80),
(103, 20021, 'A', 90),
(103, 20021, 'A', 100),
(104, 20031, 'B', 20),
(104, 20031, 'A', 50);
--pre-delete select...
SELECT * FROM #Emp e;
--============================================
DELETE e1
FROM
#Emp e1
WHERE
NOT EXISTS (
SELECT
*
FROM
#Emp e2
WHERE
e1.empid = e2.empid
AND e1.yearquarter = e2.yearquarter
AND e2.[status] = 'B'
)
--post-delete select...
SELECT * FROM #Emp e;
结果
empid yearquarter status price
----------- ----------- ------ ---------------------
101 20011 A 30.00
101 20011 A 40.00
102 20021 A 80.00
103 20021 A 90.00
103 20021 A 100.00
104 20031 B 20.00
104 20031 A 50.00
empid yearquarter status price
----------- ----------- ------ ---------------------
104 20031 B 20.00
104 20031 A 50.00
这应该符合你的要求
IF OBJECT_ID('tempdb..#Emp', 'U') IS NOT NULL
DROP TABLE #Emp;
CREATE TABLE #Emp (
empid INT NOT NULL,
yearquarter INT NOT NULL,
[status] CHAR(1) NOT NULL,
price MONEY NOT NULL
);
INSERT #Emp (empid, yearquarter, status, price) VALUES
(101, 20011, 'A', 30),
(101, 20011, 'A', 40),
(102, 20021, 'A', 80),
(103, 20021, 'A', 90),
(103, 20021, 'A', 100),
(104, 20031, 'B', 20),
(104, 20031, 'A', 50);
--pre-delete select...
SELECT * FROM #Emp e;
--============================================
DELETE e1
FROM
#Emp e1
WHERE
NOT EXISTS (
SELECT
*
FROM
#Emp e2
WHERE
e1.empid = e2.empid
AND e1.yearquarter = e2.yearquarter
AND e2.[status] = 'B'
)
--post-delete select...
SELECT * FROM #Emp e;
结果
empid yearquarter status price
----------- ----------- ------ ---------------------
101 20011 A 30.00
101 20011 A 40.00
102 20021 A 80.00
103 20021 A 90.00
103 20021 A 100.00
104 20031 B 20.00
104 20031 A 50.00
empid yearquarter status price
----------- ----------- ------ ---------------------
104 20031 B 20.00
104 20031 A 50.00
提示:WHERE NOT EXISTS()group by代表选择,no delete为什么对所有人大喊大叫?提示:WHERE NOT EXISTS()group by代表选择,no delete为什么对所有人大喊大叫?看问题。不确定员工是否与删除相关。如果是这样的话,这就是答案。如果只需要知道带有B
的yearquarter,那么@Eli给出一个简单的解决方案。我想这是一个解释问题。。。你很可能是对的。在这两种情况下,“不存在”将同样有效。“不在”将仅限于单列比较。请查看问题。不确定员工是否与删除相关。如果是这样的话,这就是答案。如果只需要知道带有B
的yearquarter,那么@Eli给出一个简单的解决方案。我想这是一个解释问题。。。你很可能是对的。在这两种情况下,“不存在”将同样有效。NOT IN将仅限于单列比较。