【问题标题】:Is it possible to get DISTINCT rows from RETURNING clause?是否可以从 RETURNING 子句中获取 DISTINCT 行?
【发布时间】:2011-02-17 07:53:15
【问题描述】:

我们使用的是 PostgreSQL v8.2.3。

是否可以使用 RETURNING 从 UPDATE 语句中获取 DISTINCT 行 子句?

MYTABLE 列是:

  1. APRIMARYKEY 列
  2. ABOOLEAN 列
  3. 电子邮件
  4. COLUMN1
  5. COLUMN2
  6. COLUMN3

使用 RETURNING 子句查询更新:

UPDATE MYTABLE SET ABOOLEANCOLUMN = true FROM MYTEMPTABLE WHERE EMAIL =
MYTEMPTABLE.EMAIL RETURNING EMAIL, COLUMN1, COLUMN2, COLUMN3;

在这种情况下,我希望从这些列中返回不同的行: 电子邮件,第 1 列,第 2 列,第 3 列。

我什至尝试了一些获取不同行的方法,但它不起作用。 虽然我仍然可以在应用层解决这个问题,但我正在努力寻找 这是否可以在查询级别解决/控制。任何不同的 想法/建议表示赞赏。

【问题讨论】:

    标签: postgresql sql-returning


    【解决方案1】:

    这是一个老问题,但由于它是搜索中的第一个答案,而我分享的答案已经过时。

    使用自 PG 版本 8.4 以来可用的公用表表达式 (CTE),您可以更新/删除并获得不同的结果。

    WITH updater AS
    (
      UPDATE MYTABLE SET ABOOLEANCOLUMN = true FROM MYTEMPTABLE WHERE EMAIL = MYTEMPTABLE.EMAIL RETURNING EMAIL, COLUMN1, COLUMN2, COLUMN3
    )
    SELECT DISTINCT EMAIL, COLUMN1, COLUMN2, COLUMN3
    FROM updater;
    

    【讨论】:

      【解决方案2】:

      不,你不能。 RETURNING 很棒,但它与普通的 SELECT 语句不同。 RETURNING 是基于记录的,而不是基于集合的。 DISTINCT 适用于一组。

      【讨论】:

      • @Frank:没有其他可能的方法可以从基于记录的 DISTINCT 行中获取?
      • 您可以将更新包装在存储过程中,并让此过程处理不同之处。但是当你不能使用 distinct 时你有什么问题? RETURNING 告诉您哪些记录已更新。
      • @Frank:基于此处的 DISTINCT 行,我在下一级附加了一些应用程序逻辑。没有别的了。
      • 在你的应用程序中修复它,保持逻辑在一起。 RETURNING 不能为你做,太糟糕了。
      • @Frank:这只是为了我的理解。 基于记录的基于集合的到底有什么区别?
      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2017-11-02
      • 2020-08-03
      相关资源
      最近更新 更多