【问题标题】:How to avoid duplicate data in the subquery如何避免子查询中的重复数据
【发布时间】:2020-09-08 11:47:42
【问题描述】:

我有两张如下表。

产品表:

+-----+------------+-----+-------+--------+
| id  | activityId | age | queue | status |
+-----+------------+-----+-------+--------+
| 100 |          2 |   0 | start |      2 |
| 101 |          3 |   0 | in    |      5 |
+-----+------------+-----+-------+--------+

部门表:

+-----+------------+-------+----------+
| id  | activityId | queue | exittime |
+-----+------------+-------+----------+
| 100 |          1 | new   | null     |
| 100 |          2 | start | null     |
| 100 |          2 | start | null     |
| 101 |          1 | new   | null     |
| 101 |          1 | new   | null     |
| 101 |          3 | in    | null     |
| 101 |          3 | in    | null     |
+-----+------------+-------+----------+

我正在尝试使用以下查询更新产品表 age 列。但其返回错误为 ORA-01427 单行子查询返回多于一行。

     update Product pd set pd.age = (select (case when dp.exittime!= null then 
     (sysdate - dp.exittime)   
     else ( case when pd.queue = dp.queue 
     then (select (sysdate - dp1.entrytime) from department dp1 where pd.id = dp1.id 
      ) else 2 END) END)
     from department dp
     where dp.id > 1
     AND pd.id = dp.id
     AND pd.status in('1','7','2','5')
     AND pd.queue= dp.queue
     AND pd.activityId = dp.activityId ) 
     where exists 
     (select 1 from department dp
     where dp.id > 1
     AND pd.id = dp.id
     AND pd.status in('1','7','2','5')
     AND pd.queue= dp.queue
     AND pd.activityId = dp.activityId );

由于部门表中的 activityId,子查询返回多个值。如何避免子查询返回多个值。

【问题讨论】:

  • 错误的哪一部分你不明白?似乎很清楚。如何修复它取决于您的数据和您想要做什么。
  • 我想用给定的条件更新Product表中对应Idage字段
  • 如果你运行你的子查询,你会看到它(至少有时)返回不止一行。要么解决数据问题(如果有的话),那么您总是会返回一行,或者添加逻辑来确定如何处理多行(平均这些值,对它们求和,取第一个/最后一个或最小值/最大值等)?

标签: sql oracle ora-01427


【解决方案1】:

此查询将识别您获得多行的场景。

select
  dp.id,
  dp.queue,
  dp.activityId,
  COUNT(*)
from
  department   dp
inner join
  product      pd
    ON  pd.id = dp.id
    AND pd.queue= dp.queue
    AND pd.activityId = dp.activityId
where
     dp.id > 1
 AND pd.status in('1','7','2','5')
GROUP BY
  dp.id,
  dp.queue,
  dp.activityId
HAVING
  COUNT(*) > 1

对于这些情况,您需要确定以下其中一项...

  • 如何修复数据以仅返回一行
  • 如何修复查询以仅返回一行
  • 如何从返回的多行中只选择一行

由于我们看不到您的数据,因此我们无法为您解决任何问题。

不过,在调查之后,您可能会返回一个更具体的问题。

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多