即使不是EXISTS也不能返回行,也无法更新

时间:2014-08-11 06:24:43

标签: sql sql-server database exists

有人可以告诉我这个SQL语句有什么问题吗?

const string updateStatement = " IF NOT EXISTS(SELECT * FROM BankAccount WHERE ac_no = @ACNumber AND deleted IS NULL) " +
                             " UPDATE BankAccount SET BankAccount.deleted = NULL WHERE ac_no = @ACNumber";

这里我正在尝试恢复已删除的银行帐户记录(逻辑删除的记录)。即使IF NOT EXISTS()部分也没有返回任何记录UPDATE也没有发生!

表格

BankAccount [ac_no(pk), emp_id, ac_name, bank_name, emp_name, status, deleted]

修改

在恢复银行帐户之前,系统应检查是否为该员工输入了任何其他银行帐户。如果同一员工有另一个银行账户,那么在任何特定时间,员工只应拥有一个银行账户时,不应发生恢复。

enter image description here

5 个答案:

答案 0 :(得分:1)

试试这个:

IF EXISTS (SELECT 1
           FROM   BankAccount AS A 
           WHERE  A.ac_no = @ACNumber 
                  AND A.deleted IS NOT NULL
                  AND NOT EXISTS (SELECT 1 
                                  FROM   BankAccount AS B 
                                  WHERE  B.Emp_id = A.Emp_id
                                         AND B.ac_no <> @ACNumber
                                         AND B.deleted IS NULL))
   UPDATE BankAccount
   SET    deleted = NULL
   WHERE  ac_no = @ACNumber AND deleted IS NOT NULL

答案 1 :(得分:1)

尝试使用以下

const string updateStatement = 
"IF ((SELECT DISTINCT 1 FROM BankAccount WHERE ac_no = @ACNumber AND deleted IS NULL)=1)"
+ 
"UPDATE BankAccount SET BankAccount.deleted = NULL WHERE ac_no = @ACNumber";

让我知道它是否适合你?

答案 2 :(得分:1)

尝试使用此功能并告诉我们结果:

const string updateStatement =
      "IF NOT EXISTS(SELECT * FROM BankAccount WHERE ac_no = @ACNumber AND ISNULL(CAST(deleted AS VARCHAR(20)),'0') = '0' ) " +
          "UPDATE BankAccount SET BankAccount.deleted = NULL WHERE ac_no = @ACNumber";

答案 3 :(得分:1)

据我了解,您要检查持有该帐户的员工是否还有其他未开帐户。

下面,BA1仅包含我们可能取消删除的帐户。 BA2包含所有员工的开户。如果员工没有开立账户,则选择不会返回任何内容。

IF NOT EXISTS (SELECT * FROM BankAccount BA1 INNER JOIN BankAccount BA2 ON BA1.ac_no = @ACNumber AND BA1.emp_id = BA2.emp_id AND BA2.deleted IS NULL)
    UPDATE BankAccount SET Deleted = NULL WHERE ac_no = @ACNumber

在您的原始声明中,您只检查该单个帐户行,并且您没有查看该员工可能拥有或可能拥有的其他帐户。如果您在运行语句时知道员工ID以及帐号,则可以将其简化为:

IF NOT EXISTS (SELECT * FROM BankAccount WHERE emp_id = @EmployeeId AND Deleted IS NULL)
    UPDATE BankAccount SET Deleted = NULL WHERE ac_no = @ACNumber

修改

我不知道它为什么不适合你。这个对我有用。这是一个例子:

DECLARE @BankAccount TABLE ([ac_no] int
                           ,[emp_id] int
                           ,[name] varchar(50)
                           ,deleted datetime
                           )

INSERT @BankAccount VALUES (17, 103, 'GS Siri', NULL)
                         , (18, 108, 'N.S Per', '2014-08-10')
                         , (19, 116, 'K.V Sil', NULL)
                         , (25, 104, 'N.Kusha', NULL)
                         , (45, 108, 'N.S Per', '2014-08-11')

SELECT * FROM @BankAccount

DECLARE @ACNumber int
SET @ACNumber = 45

IF NOT EXISTS (SELECT * FROM @BankAccount BA1 INNER JOIN @BankAccount BA2 ON BA1.ac_no = @ACNumber AND BA1.emp_id = BA2.emp_id AND BA2.deleted IS NULL)
    UPDATE @BankAccount SET Deleted = NULL WHERE ac_no = @ACNumber

SELECT * FROM @BankAccount

第一个选择显示以下内容:

ac_no  emp_id  name     deleted
17     103     GS Siri  NULL
18     108     N.S Per  2014-08-10 00:00:00.000
19     116     K.V Sil  NULL
25     104     N.Kusha  NULL
45     108     N.S Per  2014-08-11 00:00:00.000

第二个:

ac_no  emp_id  name     deleted
17     103     GS Siri  NULL
18     108     N.S Per  2014-08-10 00:00:00.000
19     116     K.V Sil  NULL
25     104     N.Kusha  NULL
45     108     N.S Per  NULL

如果你能提供一个像我上面那样无法工作的例子,我可以进一步研究。

答案 4 :(得分:1)

好的,您正在检查是否为该员工输入了任何其他银行帐户,但您的查询错误,因为ac_noPK field并且您的IF语句未返回正确的值。

您应该更改查询并将ac_no替换为emp_id并查看它。

IF NOT EXISTS(
       SELECT *
       FROM   BankAccount
       WHERE  emp_id = @EmpID
              AND DELETED IS NULL
   )
    UPDATE BankAccount
    SET    BankAccount.deleted = NULL
    WHERE  emp_id = @EmpID