Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 如果表在yearquarter中至少没有一行所需状态,则尝试从表中删除记录_Sql_Sql Server - Fatal编程技术网

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将仅限于单列比较。