有人可以告诉我这个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]
修改
在恢复银行帐户之前,系统应检查是否为该员工输入了任何其他银行帐户。如果同一员工有另一个银行账户,那么在任何特定时间,员工只应拥有一个银行账户时,不应发生恢复。
答案 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_no
为PK 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