Reputation: 47
When I try to get a random record into two tables from an Oracle database which have to a table is Order and order_detail. The result has to follow some condition that the order have 3 order_detail rows, and just retrieved a random order.
This is my code:
SELECT order_id
FROM Oder
INNER JOIN order_detail
ON orderId.order_id = order_detail.FK_order_id
WHERE order_id IN
(SELECT order_detail.FK_order_id
FROM order_detail
GROUP BY FK_order_id
HAVING COUNT(FK_order_id) > = 3
)
ORDER BY (SYS.DBMS_RANDOM.VALUE);
I DON'T KNOW WHERE TO PUT ROWNUM =1 TO GET ONLY ONE RECORD.
Upvotes: 1
Views: 1100
Reputation: 175836
You need to wrap your query with subquery:
SELECT *
FROM (SELECT order_id
FROM Oder
JOIN order_detail
ON orderId.order_id = order_detail.FK_order_id
WHERE order_id IN (SELECT order_detail.FK_order_id
FROM order_detail
GROUP BY FK_order_id
HAVING COUNT(FK_order_id) > = 3)
ORDER BY (SYS.DBMS_RANDOM.VALUE)) s
WHERE rownum=1;
Starting from Oracle 12c you could use OFFSET-FETCH
clause:
SELECT order_id
FROM Oder
INNER JOIN order_detail
ON orderId.order_id = order_detail.FK_order_id
WHERE order_id IN
(SELECT order_detail.FK_order_id
FROM order_detail
GROUP BY FK_order_id
HAVING COUNT(FK_order_id) > = 3
)
ORDER BY (SYS.DBMS_RANDOM.VALUE)
FETCH FIRST 1 ROW ONLY;
Upvotes: 1
Reputation:
You have to add ROWNUM after adding one more sub-query top on your SQL as, you are adding the RANDOM in order by and the ORDER BY is the last clause of SQL. hence you have one more level of SELECT as below.
select order_id from (SELECT order_id
FROM Oder
INNER JOIN order_detail
ON orderId.order_id = order_detail.FK_order_id
WHERE order_id IN
(SELECT order_detail.FK_order_id
FROM order_detail
GROUP BY FK_order_id
HAVING COUNT(FK_order_id) > = 3
)
ORDER BY (SYS.DBMS_RANDOM.VALUE)) where rownum <=1;
Upvotes: 1