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

插入表(如果不存在)并在两种情况下都返回ID

於英朗
2023-03-14
问题内容

我试图在 POSTGRES中 编写一个复杂的查询,这个问题是该子查询。

这是我的表(id是主键和自动递增):

id    appid    name
1      2        abc
2      2        cde

在此表中,我想获取id为“ xyz”且appid = 2的id,如果不存在,则插入并返回ID。

我知道有几个类似的问题,有些问的有些相同,我已经尝试过了,但似乎没有用。

这是我试图起诉的,但未能按预期进行:

INSERT INTO table_name (appid, name) SELECT 2, 'xyz' WHERE NOT EXISTS (SELECT id from table_name WHERE appid=2 AND name='xyz') returning id

当添加新元素并返回新添加元素的ID时,此方法效果很好,但当行已存在时不返回任何内容。

对于前

INSERT INTO table_name (appid, name) SELECT 2, 'abc' WHERE NOT EXISTS (SELECT id from table_name WHERE appid=2 AND name='abc') returning id

这不会返回任何东西。


问题答案:

你可以做:

with id as (
      select id
      from table_name
      where appid = 2 and name = 'xyz'
     ),
     i as (
      insert table_name (appid, name)
          select 2, 'xyz' 
          where not exists (select 1 from id)
          returning id
     )
select id
from id
union all
select id
from i;


 类似资料:
  • 问题内容: 我正在寻找一种将代码的一部分重构为更短,更简单的方法,但是我对Mongoose不太了解,并且不确定如何进行。 我正在尝试检查集合是否存在文档,如果不存在,则创建它。如果确实存在,我需要对其进行更新。无论哪种情况,我都需要稍后访问文档的内容。 到目前为止,我设法完成的工作是查询集合中的特定文档,如果找不到,则创建一个新文档。如果找到它,我将对其进行更新(当前使用日期作为虚拟数据)。从那里

  • 使用SpringBoot2、SpringDataJPA和Hibernate。我试图对一些从未更新过的实体使用Hibernate的二级缓存。 在我的例子中,实体与其他实体相关,因此当查询一种文档类型时,Hibernate将进行4次sql查询。使用Hibernate二级缓存时,缓存用于某些实体,但仍有一个对数据库的sql查询。我想了解为什么在一种情况下不使用缓存。 这是我的实体的样子: 当我第一次使用

  • 下面是将作者姓名添加到表中的部分代码。 我的其余代码与我认为的问题无关,因此我没有包括它。 我有一个很长的作者名列表,每次读取一个名称时,我都会尝试将其写入作者表。但是,有些名称是重复的,这是一个问题,因为name是主键,所以我无法插入重复的名称。有人知道只插入表中不存在的名称的查询吗?我正在通过jupyter笔记本使用python 2.7和sqlite,以防有人需要知道。 我意识到这个网站上已经

  • 问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0

  • 问题内容: java.lang.Math#min(double,double): 在那种情况下可以退货?NaN 似乎是在什么时候,但我无法想象一个例子。你能提供一个吗? 问题答案: 一个简单的例子是 BTW Double.compare()确实将NaN视为相等 对于多个线程,这对于任何类型和值都是可行的。例如

  • 在哪种情况下可以返回?好像是是NaN的时候,但是我想像不出一个例子。你能提供一个吗?