无法从SQL Server中的表中删除“第一条”记录

时间:2019-01-06 08:38:56

标签: sql sql-server

我正在尝试删除表客户中周期为每月(M)和每周(W)的记录。但是,使用下面的代码,不会删除任何数据。

我也尝试使用begin语句,但这仍然行不通。

我们可以使用@period IN吗?对我下面的代码有任何建议或帮助吗?

谢谢

DECLARE @Period CHAR(1)
IF @Period IN ('M','W')

BEGIN

IF EXISTS
(
SELECT TOP (1) 1 FROM Customer WITH (NOLOCK) WHERE IDNumber = '2511' AND 
Period = @Period
)

BEGIN
   DELETE FROM Customer WHERE IDNumber = '2511' AND Period = @Period
END

END

2 个答案:

答案 0 :(得分:2)

您在寻找

DECLARE @Period CHAR(1)= '?';

DELETE FROM Customer 
WHERE IDNumber = '2511' 
      AND Period = @Period
      AND(@Period = 'M' OR @Period = 'W');

或者,如果您想删除IDNumber = '2511'以及'W''M'的所有行,则可以这样做

DELETE FROM Cutomer
WHERE IDNumber = '2511'
      AND 
      (Period = 'M' OR Period = 'W');-- Period IN('M', 'W');

由于您要同时删除两者,因此需要将变量的长度从1更改为3,然后可以使用 LEFT() 和< strong> RIGHT() 的功能为

DECLARE @Period CHAR(3) = 'M,W';

DELETE FROM Customer 
WHERE IDNumber = '2511' 
      AND 
      (Period = LEFT(@Period, 1) OR Period = RIGHT(@Period, 1));

或将 LIKE 运算符用作

DECLARE @Period CHAR(3)='M,W';

DELETE FROM Customer 
WHERE IDNumber = '2511' 
      AND 
      ',' + @Period + ',' LIKE '%,' + Period + ',%';

如果您确实要使用IN()运算符,则有三种选择:

1-使用 common table expression (CTE)

DECLARE @Period CHAR(3)='M,W';

WITH CTE AS
(
  SELECT LEFT(@Period, 1) Val
  UNION
  SELECT RIGHT(@Period, 1)
)
DELETE FROM Customer 
WHERE IDNumber = '2511' 
      AND 
      Period IN(SELECT * FROM CTE);

-2使用 SubQuery

DECLARE @Period CHAR(3)='M,W';

DELETE FROM Customer 
WHERE IDNumber = '2511' 
      AND 
      Period IN(
                 SELECT LEFT(@Period, 1)
                 UNION
                 SELECT RIGHT(@Period, 1)
               );

3-使用 STRING_SPLIT() 函数(或您自己的字符串拆分器函数)

DECLARE @Period CHAR(3)='M,W';

DELETE FROM Customer 
WHERE IDNumber = '2511' 
      AND 
      Period IN(
                 SELECT Value
                 FROM STRING_SPLIT(@Period, ',')
               );

结论:

希望使用 IN() 运算符

  

确定指定的值是否与子查询或列表中的任何值匹配。

因此,当您将变量赋给IN()运算符时,它不会执行您期望的操作,因为您的变量是 string ,而不是子查询 list 都没有。这就是为什么以下查询不会删除任何行的原因。

DECLARE @Period CHAR(3)='M,W';

DELETE FROM Customer 
WHERE IDNumber = '2511' 
      AND 
      Period IN(@Period);

Here is a live demo for those queries

答案 1 :(得分:0)

您的代码无效,因为您尚未为@Period分配值。想必您的意图是这样的:

IF EXISTS (SELECT TOP (1) 1
           FROM Customer 
           WHERE IDNumber = '2511' AND Period IN ('M', 'W')
          )
BEGIN
    DELETE FROM Customer
        WHERE IDNumber = '2511' AND Period IN ('M', 'W');
END;

这将删除Customers中的所有匹配行,因此IF是不必要的。一个没有条件的简单删除会做同样的事情:

DELETE FROM Customer
    WHERE IDNumber = '2511' AND Period IN ('M', 'W');

如果您只想删除一个匹配行:

DELETE c FROM 
    FROM (SELECT TOP (1) c.*
          FROM Customer c
          WHERE c.IDNumber = '2511' AND c.Period IN ('M', 'W')
         );

我建议您不要忘记@period,直到您了解如何真正地去做DELETE