SQL-从“选择返回的多个行”中收集值

时间:2018-08-20 02:27:51

标签: sql postgresql select

我有一张桌子。

<table>
  <tr>
    <td>ID</td><td style="width:20px"></td>
    <td>Value</td>
  </tr>
  <tr>
    <td>1</td><td style="width:20px"></td>
    <td>A1</td>
  </tr>
  <tr>
    <td>2</td><td style="width:20px"></td>
    <td>B1</td>
  </tr>
  <tr>
    <td>3</td><td style="width:20px"></td>
    <td>C1</td>
  </tr>
  <tr>
    <td>1</td><td style="width:20px"></td>
    <td>A2</td>
  </tr>
  <tr>
    <td>2</td><td style="width:20px"></td>
    <td>B2</td>
  </tr>
  
</table>

我想更新表B中的ID相同的ID的表B中的值列

<table>
  <tr>
    <td>ID</td><td style="width:20px"></td>
    <td>Value</td>
  </tr>
  <tr>
    <td>1</td><td style="width:20px"></td>
    <td>A1;A2</td>
  </tr>
  <tr>
    <td>2</td><td style="width:20px"></td>
    <td>B1;B2</td>
  </tr>
  <tr>
    <td>3</td><td style="width:20px"></td>
    <td>C1</td>
  </tr>
  
</table>

我已经运行了这个查询:

update B
    set B.value = (select A.value from A where A.ID = B.ID);

但它显示“错误:由用作表达式的子查询返回的一行以上”

我该如何解决?非常感谢!

1 个答案:

答案 0 :(得分:1)

您正在寻找string_agg()

update B
    set B.value = (select string_agg(A.value, ';')
                   from A
                   where A.ID = B.ID
                  );