sqlite 如何返回值冲突的行的ID?

5kgi1eie  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(156)

我希望在SQLite数据库(版本高于3.35)中插入或更新值,以避免多个查询。upsertreturning似乎很有希望:

CREATE TABLE phonebook2(
  name TEXT PRIMARY KEY,
  phonenumber TEXT,
  validDate DATE
);
INSERT INTO phonebook2(name,phonenumber,validDate)
  VALUES('Alice','704-555-1212','2018-05-08')
  ON CONFLICT(name) DO UPDATE SET
    phonenumber=excluded.phonenumber,
    validDate=excluded.validDate
  WHERE excluded.validDate>phonebook2.validDate RETURNING name;

这有助于我跟踪与插入/修改的行对应的名称。如何查找phonebook2值与上述语句中的值冲突,但由于WHERE子句而没有发生INSERT或UPDATE?

v09wglhw

v09wglhw1#

RETURNING子句不能用于获取不受影响的行。
您可以做的是在UPSERT之前执行一条SELECT语句:

WITH cte(name, phonenumber, validDate) AS (VALUES
  ('Alice', '704-555-1212', '2018-05-08'),
  ('Bob','804-555-1212', '2018-05-09')
) 
SELECT *
FROM phonebook2 p
WHERE EXISTS (
  SELECT *
  FROM cte c
  WHERE c.name = p.name AND c.validDate <= p.validDate
);

CTE中,您可以包含任意数量的元组

相关问题