Как использовать результаты запроса oracle sql с оператором in? - PullRequest
1 голос
/ 22 апреля 2020

Я хотел бы создать запрос с использованием оператора in на основе результата запроса count (), имеющего count () = 1. Пожалуйста, см. Запрос ниже.

select count(*), pr.oid
join jrtepiperun pr on pr.oid = it.oid
join xownsparts x on x.oidorigin = pr.oid
having count(*) = 1
group by pr.oid;

Этот запрос успешно возвращает в общей сложности 1589 строк, где count (*) = 1 для каждой строки и pr.oid варьируется. Теперь я хочу создать еще один запрос на основе результата pr.oid, как показано ниже.

select * from jpipelinesystem pl
join xsystemhierarchy x on x.oidorigin = pl.oid
join jrtepiperun pr on pr.oid = x.oiddestination
where pr.oid
in
(
select count(*), pr.oid from
rtrprdb.jrtepiperun pr
join rtrprdb.xownsparts x on x.oidorigin = pr.oid
having count(*) = 1
group by pr.oid
);

Однако это возвращает ошибку о том, что слишком много значений. ORA-00913: слишком много значений 00913. 00000 - «слишком много значений» * Причина:
* Действие: Ошибка в строке: 20 Столбец: 1

Как использовать результаты pr.oid из первый запрос для второго запроса? Обратите внимание, что мне нужно иметь два столбца, так как я хочу условие, где count (*) = 1.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Попробуйте следующим образом -

вам необходимо удалить count(*) из списка выбора, поскольку вы сравниваете одно значение pr.oid

Еще одна ошибка: having clause всегда будет после group by clause

select * from jpipelinesystem pl
join xsystemhierarchy x on x.oidorigin = pl.oid
join jrtepiperun pr on pr.oid = x.oiddestination
where pr.oid
in
(
select pr.oid from
rtrprdb.jrtepiperun pr
join rtrprdb.xownsparts x on x.oidorigin = pr.oid
group by pr.oid having count(*) = 1
);
0 голосов
/ 22 апреля 2020

Вы также можете использовать другой подход. Используйте analytical function следующим образом:

SELECT * FROM 
( SELECT <required columns>, COUNT(1) OVER(PARTITION BY PR.OID) AS CNT
    FROM JPIPELINESYSTEM PL
         JOIN XSYSTEMHIERARCHY X ON X.OIDORIGIN = PL.OID
         JOIN JRTEPIPERUN PR ON PR.OID = X.OIDDESTINATION
         JOIN RTRPRDB.XOWNSPARTS XPR ON XPR.OIDORIGIN = PR.OID
) where CNT = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...