【问题标题】:Delete Null Values Query删除空值查询
【发布时间】:2018-10-31 05:07:06
【问题描述】:

我需要编写一个 SQL 查询,该查询需要删除所有为空的书籍。

到目前为止,我已经创建了一个查询,显示哪些书被空了:

显示哪些书已被取消的查询

现在我需要计算 SQL 查询以删除所有无效的书籍。我假设查询是:

【问题讨论】:

  • book_num 是唯一的吗?

标签: sql oracle sql-delete


【解决方案1】:

你可以试试下面

DELETE FROM BOOK
WHERE EXISTS (SELECT 1 FROM BOOK B 
  FULL JOIN CHECKOUT C ON C.BOOK_NUM = B.BOOK_NUM 
  WHERE C.CHECK_OUT_DATE IS NULL);

【讨论】:

  • 我正在使用 Oracle Live SQL 运行您给我的查询,我收到一条错误消息,提示“ORA-00933: SQL 命令未正确结束”
  • 我收到一条错误消息“ORA-00904: "B"."BOOK_NUM": invalid identifier"
  • @Jonn,你现在可以试试 - 有一个错字
  • 它运行,这是个好消息,但输出显示“0 行已删除”而不是 7。
  • 现在我收到一条错误消息,显示“ORA-02292:违反完整性约束 (SQL_NBCXWVRZWBOOGQVSGSFBHGJLW.SYS_C006433585) - 发现子记录 ORA-06512:在“SYS.DBMS_SQL”第 1721 行”
【解决方案2】:

我不确定FULL JOIN 在定义良好的数据模型中做了什么。大概,你想要:

DELETE FROM BOOK
WHERE NOT EXISTS (SELECT 1
                  FROM CHECKOUT C
                  WHERE C.BOOK_NUM = B.BOOK_NUM AND
                        C.CHECK_OUT_DATE IS NOT NULL
                 );

【讨论】:

    【解决方案3】:
    DELETE FROM BOOK 
     WHERE BOOK_NUM IN
    (SELECT B.BOOK_NUM
      FROM BOOK B FULL JOIN CHECKOUT C ON C.BOOK_NUM = B.BOOK_NUM
     WHERE C.CHECK_OUT_DATE IS NULL);
    

    内部查询将选择所有没有 check_out_date 的 book_num。 如果内部查询返回 book_num,外部查询将删除 books 表中存在的书籍。

    【讨论】:

    • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案 - From Review
    • 请解释您的答案是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多