【问题标题】:PostgreSQL - Update table with subquery from updated table itselfPostgreSQL - 使用更新表本身的子查询更新表
【发布时间】:2013-05-30 11:31:06
【问题描述】:

我有一个包含以下值的表:“user_id, text, text_lang, user_lang”。

字段 text_lang 包含一个表示文本语言的区域设置快捷方式('en'、'de')。我现在想通过选择每个 user_id 出现次数最多的 text_lang 来设置(未知/空)“user_lang”。

我有一个有效的 select 语句,它返回每个 user_id 出现次数最多的 text_lang,但我不知道如何根据 ID 更新每行的 user_lang。

SELECT user_id, text_lang
FROM (
    SELECT  user_id,
        text_lang,
        max(text_lang_count) OVER (PARTITION BY user_id) max_count,
        text_lang_count
    FROM (
        SELECT  user_id,
                text_lang,
                COUNT(text_lang) AS text_lang_count
        FROM test
        GROUP BY user_id, text_lang
    ) AS xx
) AS xy
WHERE tweet_lang_count = max_count

我假设(但不确定)MySQL/SQL: Update with correlated subquery from the updated table itself 包含与我的问题密切相关的内容,但我无法使该解决方案适应这个特定问题。

【问题讨论】:

    标签: sql postgresql subquery


    【解决方案1】:

    SQL Fiddle

    with lang as (
        select distinct on (user_id)
            user_id, text_lang, text_lang_count
        from (
            select
                user_id,
                text_lang,
                count(text_lang) as text_lang_count
            from t
            group by user_id, text_lang
        ) s
        order by 1, 3 desc, text_lang != 'en' -- in a tie english wins
    )
    update t
    set user_lang = lang.text_lang
    from lang
    where t.user_id = lang.user_id
    

    计算 CTE 中的主要语言 (with) 并在 from 子句中使用它

    【讨论】:

    • 像魅力一样工作。感谢您提供完整的查询解决方案和额外的 cookie,甚至考虑了“tie”的情况!第一次使用“with as”对我很有用。还不能投票给你的答案,但我接受了。
    【解决方案2】:

    PostgreSQL 中的相关更新具有与 MySQL 不同的语法。 可以这样写:

    UPDATE tablename T
     SET user_lang=subquery.text_lang
     FROM ( SELECT user_id,text_lang FROM... etc... ) subquery
     WHERE T.user_id=subquery.user_id
    

    子查询正是您从问题中选择的查询。

    不过,以上内容是非标准的。符合 SQL 标准的形式如下:

    UPDATE tablename T
     SET user_lang=(SELECT text_lang FROM ... WHERE... AND user_id=T.user_id)
    

    但使用这种形式,您将不得不重新调整初始查询,以计算所需的 text_lang 仅针对一个特定的 user_id

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2021-01-19
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多