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_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

【讨论】:

我对你的两个答案都投了赞成票,因为我不得不接受@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 用法

带有“IF NOT EXISTS”的原始 SQL 不会执行

Hive 中的错误:对于 Exists/Not Exists 运算符,子查询必须是相关的

使用 NOT EXISTS 重写查询的指南