Выберите случайную запись с подзапросом в Oracle SQL - PullRequest
0 голосов
/ 06 мая 2018

Когда я пытаюсь получить случайную запись в две таблицы из базы данных Oracle, то есть для таблицы есть Order и order_detail. Результат должен соответствовать некоторому условию, чтобы в ордере было 3 строки order_detail, и только что был получен случайный порядок.

Это мой код:

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);

Я НЕ ЗНАЮ, ГДЕ ПОЛОЖИТЬ ROWNUM = 1, ЧТОБЫ ПОЛУЧИТЬ ТОЛЬКО ОДНУ ЗАПИСЬ.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы должны добавить ROWNUM после добавления еще одной вершины подзапроса в SQL, так как вы добавляете RANDOM по порядку, а ORDER BY является последним предложением SQL. следовательно, у вас есть еще один уровень SELECT, как показано ниже.

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;
0 голосов
/ 06 мая 2018

Вам нужно обернуть ваш запрос подзапросом:

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;

Начиная с Oracle 12c, вы можете использовать предложение OFFSET-FETCH:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...