if not exists (SELECT * From TA_ARTIFICER Where ARTID = @Artid)是啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了if not exists (SELECT * From TA_ARTIFICER Where ARTID = @Artid)是啥意思?相关的知识,希望对你有一定的参考价值。
为什么要用到if not exists呢?在什么时候要用到 if not exists()?它的作用是什么?
前面有if...一个条件...do...执行一个任务...
if not exists,即如果不存在。
(从TA_ART 中找符合条件:ARTID为前面写着东西或没有东西的Artid 的所有资料 )
一般是编程用的 参考技术A 在前面的搜索语句找不到东西的时候,执行后面的搜索语句。 参考技术B 不存在的时候,执行()
即使 IF NOT EXISTS 不返回行也无法更新
【中文标题】即使 IF NOT EXISTS 不返回行也无法更新【英文标题】:Cannot UPDATE even IF NOT EXISTS doesn't return rows 【发布时间】:2014-08-11 06:24:42 【问题描述】:谁能告诉我这条 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]
编辑:
在恢复银行帐户之前,系统应检查是否为该员工输入了任何其他银行帐户。如果同一员工有另一个银行账户,则不应进行恢复,因为在任何给定时间,员工都应该只有一个银行账户。
【问题讨论】:
给我们看一些数据怎么样 我觉得你的逻辑有问题,你应该检查IF EXISTS .. deleted IS NOT NULL
@Satya,帖子已更新。谢谢。
您不需要检查帐号,因为要求是检查emp_id。所以请检查 Emp_Id,然后只更新该员工的帐户。
【参考方案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
如果你能提供一个像我上面那样不起作用的例子,我可以进一步研究。
【讨论】:
你说得对。但是sql
代码对我不起作用!
@Chathuranga - 哪里出错了?它有任何错误吗?
没有错误。但是 UPDATE 没有发生。关于第二个答案,实际上我没有employeeID。 :(
@Chathuranga - 查看更新。我不知道为什么它不适合你。
现在它可以在 SQL 中工作了;)。我想知道为什么它在应用程序(C#)中对我不起作用,但我仍在研究它。非常感谢您的支持!【参考方案2】:
试试下面的
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";
让我知道它是否对你有用?
【讨论】:
不走运。即使没有任何其他员工拥有将要恢复的银行帐户,它也不会更新! 尝试在 SQL 中使用相同的查询。我认为问题出在数据上。我在本地数据库上亲自测试过类似的查询,【参考方案3】:尝试使用它并告诉我们它的结果:
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";
【讨论】:
对不起,IS_NULL
替换为 ISNULL
它将检查列,如果它为空,则将其值替换为 0 以检查条件
deleted 是一个 DateTime 字段。当您删除一条记录时,它只保留删除的日期和时间。如果为 null 则表示记录处于活动状态。
我知道这一点,但有时当您检查字段 IS NULL 时返回 false,因为该字段显示为空,您是否检查了我的查询?【参考方案4】:
好的,您正在检查是否为该员工输入了任何其他银行帐户,但您的查询是错误的,因为 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
【讨论】:
我对你的两个答案都投了赞成票,因为我不得不接受@Alex Humphrey 的答案,因为我从那个答案中意识到了我的错误。为我的错误道歉。再次感谢;)【参考方案5】:试试这个:
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
【讨论】:
其实这不是我想要的。请参阅编辑: 不走运。它没有用。实际上我想在恢复之前检查该员工(持有将要恢复的银行帐户的人)是否有任何其他银行帐户(未删除)! 这也不起作用 :(。即使该员工没有任何其他活动的银行账户,它也不会将已删除的字段更新为 NULL 现在它适用于 SQL。我的应用程序有问题。为错误道歉。非常感谢你! ;)以上是关于if not exists (SELECT * From TA_ARTIFICER Where ARTID = @Artid)是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
if not exists (SELECT * From TA_ARTIFICER Where ARTID = @Artid)是啥意思?
oracle insert if not exists 语句
SQLSERVER 和 ORACLE的if not exist 用法