【问题标题】:update multiple values in specific column in PostgreSQL 10.11更新 PostgreSQL 10.11 中特定列中的多个值
【发布时间】:2021-02-04 03:48:40
【问题描述】:

在 SQLYOG 中,以下代码运行良好,但我如何在 PostgreSQL 10.11 中使用此代码 我有大量数据要做同样的事情,这里是我的一些数据示例

我的表结构:-

CREATE TABLE shg_members (
  `id` INTEGER,
  `shg_id` INTEGER,
  `member_name` VARCHAR(14),
  `leadership_status` VARCHAR(9),
  `other_education` VARCHAR(9)
);

INSERT INTO shg_members
  (`id`, `shg_id`, `member_name`, `leadership_status`, `other_education`)
VALUES
  ('26', '18579', 'SARABJET KAUR', NULL, NULL),
  ('27', '18579', 'KULADIP KAUR', NULL, NULL),
  ('28', '18579', 'PARVINDER KAUR', 'President', NULL),
  ('29', '18579', 'KAMALJIT KAUR', NULL, NULL),
  ('30', '18579', 'JASPREET KAUR', NULL, NULL),
  ('31', '18579', 'LAJVANTI', 'President', NULL),
  ('32', '18579', 'RANJEET KAUR', 'President', NULL),
  ('33', '18579', 'GURPRIT KOUR', NULL, NULL),
  ('34', '18579', 'MANJEET KOUR', NULL, NULL),
  ('35', '18579', 'KULVINDER KAUR', NULL, NULL),
  ('36', '18579', 'KAMAL KAUR', NULL, NULL),
  ('37', '18579', 'SARJEET KAUR', NULL, NULL),
  ('38', '18580', 'KASHMIR KAUR', NULL, NULL),
  ('39', '18580', 'KIRANDEEP KOUR', 'President', NULL),
  ('40', '18580', 'SUKHDEEP KAUR', 'President', NULL),
  ('41', '18580', 'AMARJEET KAUR', 'President', NULL);

使用给定的查询

UPDATE shg_members s
INNER JOIN (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY shg_id ORDER BY id) rn
  FROM shg_members
  WHERE shg_id IN (18579, 18580)
) t ON t.id = s.id
SET s.leadership_status = CASE t.rn
  WHEN 1 THEN 'President'
  WHEN 2 THEN 'Secretary'
  WHEN 3 THEN 'Treasurer'
  ELSE 'Member'
END 

结果

> id | shg_id | member_name    | leadership_status | other_education
> -: | -----: | :------------- | :---------------- | :--------------
> 26 |  18579 | SARABJET KAUR  | President         | null          
> 27 |  18579 | KULADIP KAUR   | Secretary         | null          
> 28 |  18579 | PARVINDER KAUR | Treasurer         | null          
> 29 |  18579 | KAMALJIT KAUR  | Member            | null          
> 30 |  18579 | JASPREET KAUR  | Member            | null          
> 31 |  18579 | LAJVANTI       | Member            | null          
> 32 |  18579 | RANJEET KAUR   | Member            | null          
> 33 |  18579 | GURPRIT KOUR   | Member            | null          
> 34 |  18579 | MANJEET KOUR   | Member            | null          
> 35 |  18579 | KULVINDER KAUR | Member            | null          
> 36 |  18579 | KAMAL KAUR     | Member            | null          
> 37 |  18579 | SARJEET KAUR   | Member            | null          
> 38 |  18580 | KASHMIR KAUR   | President         | null          
> 39 |  18580 | KIRANDEEP KOUR | Secretary         | null          
> 40 |  18580 | SUKHDEEP KAUR  | Treasurer         | null          
> 41 |  18580 | AMARJEET KAUR  | Member            | null

但现在在 PostgreSQL 10.11 中我如何获得相同的输出

【问题讨论】:

    标签: sql postgresql sql-update inner-join


    【解决方案1】:

    Postgres 与许多其他数据库实际上一样,使用FROM 子句实现更新/连接语法。你可以这样表述:

    UPDATE shg_members s
    SET leadership_status = CASE t.rn
      WHEN 1 THEN 'President'
      WHEN 2 THEN 'Secretary'
      WHEN 3 THEN 'Treasurer'
      ELSE 'Member'
    END 
    FROM (
      SELECT s.*, ROW_NUMBER() OVER (PARTITION BY shg_id ORDER BY id) rn
      FROM shg_members s
      WHERE shg_id IN (18579, 18580)
    ) t 
    WHERE t.id = s.id
    

    【讨论】:

    • 代码工作,但它更新所有成员前 3 个条件无法执行
    • @DeveshSharma:我不清楚你的评论。这是一个 db fiddle:dbfiddle.uk/…。这确实会为您的示例数据产生您想要的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多