【发布时间】:2020-06-22 15:34:07
【问题描述】:
我想根据 Postgres 中的子查询结果更新表 prod_replay_out。但是,子查询返回多行,但我想跳过这些行并根据子查询返回的单行更新表。
我已经引用了链接Subquery returns more than 1 row error,但max() 函数不适用于我的预期结果。你能给我一些修改查询的建议吗?谢谢。
prod_replay_out 有以下列:
卖家、买家、sender_tag、seller_tag、buyer_tag、isin、数量、in_msg_time、msg_type、cdsx_time
prod_replay_in 有以下列:
卖家、买家、sender_tag、seller_tag、buyer_tag、isin、数量、msg_type、cdsx_time
我尝试了什么?
请在下面找到更新sql:
更新sql:
update prod_replay_out O
set in_msg_id =
(Select id
From prod_replay_in I
Where I.msg_type = 'CDST010'
and I.seller = O.seller
and I.buyer = O.buyer
and I.sender_tag = O.sender_tag
and I.seller_tag = O.seller_tag
and I.buyer_tag = O.buyer_tag
and I.isin = O.isin
and I.quantity = O.quantity
and I.cdsx_time = O.in_msg_time
and I.cdsx_time::text like '2020-05-12%'
)
where O.msg_type = 'CDST01C'
and O.cdsx_time::text like '2020-05-12%';
我尝试了以下解决方案。是正确的做法还是有什么漏洞?
update prod_replay_out O
set in_msg_id =
(Select id
From prod_replay_in I
Where I.msg_type = 'CDST010'
and I.seller = O.seller
and I.buyer = O.buyer
and I.sender_tag = O.sender_tag
and I.seller_tag = O.seller_tag
and I.buyer_tag = O.buyer_tag
and I.isin = O.isin
and I.quantity = O.quantity
and I.cdsx_time = O.in_msg_time
and I.cdsx_time::text like '2020-05-12%'
and 1 = (Select count(id)
From prod_replay_in I
Where I.msg_type = 'CDST010'
and I.seller = O.seller
and I.buyer = O.buyer
and I.sender_tag = O.sender_tag
and I.seller_tag = O.seller_tag
and I.buyer_tag = O.buyer_tag
and I.isin = O.isin
and I.quantity = O.quantity
and I.cdsx_time = O.in_msg_time
and I.cdsx_time::text like '2020-05-12%'
)
)
where O.msg_type = 'CDST01C'
and O.cdsx_time::text like '2020-05-12%';
【问题讨论】:
-
不清楚你需要什么逻辑。请编辑问题并向我们展示一些示例数据(表中的十几行就足够了)以及您希望从查询中得到什么结果。如果子查询返回多于 1 行,您要使用哪一行?有随机的吗?
-
您的 Postgres 版本和实际的精确表定义(
CREATE TABLE语句)将有助于获得最佳解决方案。
标签: sql postgresql select sql-update subquery