【问题标题】:How do I return multiple column from a nested select in postgresql query?如何从 postgresql 查询中的嵌套选择返回多列?
【发布时间】:2020-11-19 16:55:54
【问题描述】:

我有一个如下所示的 postgresql 查询:

      update service_requests
      set service_request_status = 'Rejected', modified_on = now()
      where service_request_id = $1 and service_request_status = 'Submitted'
      returning 
        (select service_request_id, service_request_status, requestor_id
        from service_requests
        where service_request_job_uuid in
          (select service_request_job_uuid from service_requests where service_request_id = $1)
        )

我收到一个错误:子查询必须只返回一列

但我至少需要返回三个:service_request_id、service_request_status、requestor_id。并且它们需要从被更新的记录所属的一组记录中返回。

这个想法是这样的:用户向一个或多个我们称之为“专业人士”的“专业人士”提交服务请求。这些专业人士对服务请求进行投标。每个专业人士的数据库中都有一行,它们按 service_request_job_uuid 列分组在一起。在专业人士拒绝服务请求的情况下,将运行此查询。我们想返回该服务请求对应的所有记录,看看是否还有其他专业人士尚未拒绝该服务请求。

但是如果我在第一个嵌套选择中不能选择多个列,我该如何返回我需要的信息呢?

谢谢。

【问题讨论】:

    标签: sql postgresql sql-update subquery sql-returning


    【解决方案1】:

    我想你想要:

    with upd as (
        update service_requests
        set service_request_status = 'Rejected', modified_on = now()
        where service_request_id = $1 and service_request_status = 'Submitted'
        returning service_request_id 
    )
    select service_request_id, service_request_status, requestor_id
    from service_requests sr
    where exists (
        select 1 
        from service_requests sr1
        inner join upd u on u.service_request_id = sr1.service_request_id 
        where sr1.service_request_job_uuid = sr.service_request_job_uuid
    )
    

    或者,也许:

    with upd as (
            update service_requests
            set service_request_status = 'Rejected', modified_on = now()
            where service_request_id = $1 and service_request_status = 'Submitted'
            returning service_request_job_uuid 
        )
    select sr.service_request_id, sr.service_request_status, sr.requestor_id
    from service_requests sr
    inner join upd u on u.service_request_job_uuid = sr.service_request_job_uuid
    

    【讨论】:

    • 感谢专线小巴。我创建了您的查询的修改版本:使用 updated_request 作为(更新 service_requests set service_request_status = 'Rejected', modified_on = now() where service_request_id = $1 and service_request_status = 'Submitted' 返回 service_request_job_uuid)选择 sr.service_request_id, sr.service_request_status, sr .requestor_id, service_request_job_uuid from service_requests sr where sr.service_request_job_uuid = updated_request.service_request_job_uuid 但现在它告诉我:缺少表“updated_request”的 FROM 子句条目
    • @gib65:你为什么要修改我提供的查询,它不会产生你想要的结果吗?
    • 不,它没有。它只是给了我更新的记录。我需要属于 service_request_job_uuid 定义的组的所有记录。
    • @gib65:我认为我们可以简化这一点。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 2016-02-19
    • 2014-06-16
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多