当前位置: 首页 > 面试题库 >

仅当值不存在时才返回行

裴意
2023-03-14
问题内容

我有2张桌子- reservation

   id  | some_other_column
   ----+------------------
   1   | value
   2   | value
   3   | value

第二张桌子- reservation_log

   id  | reservation_id | change_type
   ----+----------------+-------------
   1   | 1              | create
   2   | 2              | create
   3   | 3              | create
   4   | 1              | cancel
   5   | 2              | cancel

我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单WHERE change_type = cancel条件的已取消,但由于WHERE未在此处取消工作,因此我在努力避免未取消。


问题答案:
SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
                 FROM reservation_log
                 WHERE change_type = 'cancel')

要么:

SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL

第一个版本更直观,但是我认为第二个版本通常可以获得更好的性能(假设您在联接中使用的列上有索引)。

第二个版本有效,因为LEFT JOIN返回第一个表中所有行的一行。当ON条件成功,这些行会包括从第二表中的列,就像INNER JOIN。当条件失败时,返回的行将包含NULL第二个表中的所有列。然后,WHERE l.id IS NULL测试将匹配这些行,因此它将查找表之间不匹配的所有行。



 类似资料:
  • 当我返回值时,我使用Mailchimp api,它工作正常,但当我不返回任何值时,它不工作,也不会引发任何异常。 这不是保存数据

  • 问题内容: 我需要将以下行添加到配置文件的末尾: 到一个名为 我正在寻找用于执行此操作的方法,但无法解决。 如果该行尚不存在,我将如何插入? 问题答案: 保持简单:) grep + echo 应该足够了: 安静 整行匹配 模式是一个普通的字符串 https://linux.die.net/man/1/grep 编辑:合并@cerin和@ thijs-wouters建议 。

  • 问题内容: 我希望根据该文件是否已经存在来写一个文件,仅在不存在的情况下才写(实际上,我希望继续尝试文件,直到找到一个不存在的文件为止)。 下面的代码显示在其中一个潜在的攻击者可以插入一个符号,作为建议的方式这篇文章中该文件的测试和写入的文件之间。如果代码以足够高的权限运行,则可能会覆盖任意文件。 有什么办法解决这个问题? 问题答案: 编辑 :另请参见DaveJones的回答:从Python3.3

  • 我在Excel中有下面的测试表。我希望能够使用公式(如果可以,也可以使用另一个),它只会在单元格DATE1和DATE2匹配时返回行。 我无法将日期直接输入到公式中,因为日期可以是3年前的任何范围。任何帮助将不胜感激。

  • 问题内容: 我打电话来创建一个文件夹,其中包含一组特定的生成数据。但是,即使尚未创建我指定的路径,也会引发该路径已存在的OSError。 例如,我打电话: 即使我在任何地方都没有测试目录或名为test的文件,也会导致此调用。 注意:我使用的实际路径名不是“ test”,而是更确定的东西,我确定它没有在任何地方命名。 请帮忙? 问题答案: 格雷格的答案是正确的,但还远远不够。 具有次错误条件,并且您

  • 阅读文档后发现,当路径不存在时,childEventListener似乎不会激发。 这是一个问题,因为我想向用户显示一条没有数据的消息。 我可以添加一个valueEventListener,就像这个答案一样,但我将查询限制为最新的值,即query.limitTolast()并且valueEventListener不限制ToLast而是获取路径中的所有数据。