Подзапрос возвращает более одного значения
У меня есть следующий запрос, который дает дает req_no and order_no
, order_no
это из подзапроса, который вы можете увидеть ниже sql. Для немногих req_no
их больше одного order_no's
и из-за этого я получаю ORA-01427: single-row subquery returns more than one row
,
Я хотел бы отобразить как order_no
для одного req_no
Как я могу достичь этого? Любая помощь очень заметна.
Спасибо
PS Одна база данных нашего клиента все еще Oracle 8i
,
SELECT max_qst.req_no,
(SELECT DISTINCT max_odr.order_no
FROM maximo_orders max_odr,
maximo_order_revisions max_odv,
maximo_order_items max_odi,
maximo_order_dates max_odd,
maximo_requisition_order max_rqo,
maximo_requisition_details max_req
WHERE max_req.req_no = max_qst.req_no
AND max_req.req_yr = max_qst.req_yr
AND max_odr.order_no = max_odi.order_no
AND max_odi.order_item_id = max_odd.order_item_id
AND max_req.requisition_item_id = max_rqo.requisition_item_id
AND max_rqo.order_schedule_id = max_odd.order_schedule_id
AND max_odv.order_no = max_odi.order_no
AND max_odv.revision_no =
(SELECT MAX (max_alias.revision_no)
FROM maximo_order_revisions max_alias
WHERE max_alias.order_no = max_odv.order_no)
AND maximo_order_item (max_odi.order_no,
max_odv.revision_no,
max_odi.order_item_id
) = 'CONFIRMED'
)
FROM maximo_requisitions max_qst, maximo_requisition_details max_qsd
WHERE max_qst.qst_id = max_qsd.qst_id
AND max_qst.enter_date = '2001'
AND max_qst.req_no = 'PUR_12WX'
Update 1
Желаемый выход.
REQ_No ORDER_NO
PUR_12WX PR_9078
PUR_12WX PR_9079
2 ответа
Используйте объединение вместо коррелированного подзапроса.
Я удалил max_qst
ссылки из подзапроса и переместили их в предикат соединения.
Я также только что изменил его, чтобы использовать LEFT JOIN
, Это учитывает возможность отсутствия order_no
возвращенные значения
SELECT
max_qst.req_no,
sub_query.order_no
FROM
maximo_requisitions max_qst
INNER JOIN
maximo_requisition_details max_qsd
ON max_qst.qst_id = max_qsd.qst_id
LEFT JOIN
(
SELECT DISTINCT
max_odr.order_no,
max_req.req_no,
max_req.req_yr
FROM
maximo_orders max_odr,
maximo_order_revisions max_odv,
maximo_order_items max_odi,
maximo_order_dates max_odd,
maximo_requisition_order max_rqo,
maximo_requisition_details max_req
WHERE
max_odr.order_no = max_odi.order_no
AND max_odi.order_item_id = max_odd.order_item_id
AND max_req.requisition_item_id = max_rqo.requisition_item_id
AND max_rqo.order_schedule_id = max_odd.order_schedule_id
AND max_odv.order_no = max_odi.order_no
AND max_odv.revision_no = (SELECT MAX (max_alias.revision_no)
FROM maximo_order_revisions max_alias
WHERE max_alias.order_no = max_odv.order_no)
AND maximo_order_item (max_odi.order_no, max_odv.revision_no, max_odi.order_item_id) = 'CONFIRMED'
)
suq_query
ON max_qst.req_no = sub_query.req_no
AND max_qst.req_yr = sub_query.req_yr
WHERE
max_qst.enter_date = '2001'
max_qst.req_no = 'PUR_12WX'
Ты можешь использовать
DISTINCT
или же
WHERE ROWNUM = 1
Но я бы посоветовал вам выяснить, почему возвращается более одной строки: неправильно поняли данные, пропустили соединение, есть ли ошибочные или дублированные данные и т. Д. И т. Д.