ЗАКАЗАТЬ в предложении GROUP BY - PullRequest
1 голос
/ 30 августа 2011

У меня есть запрос

 Select
 (SELECT id FROM xyz M  WHEREM.ID=G.ID AND ROWNUM=1 ) TOTAL_X,
count(*) from mno G where col1='M' group by col2  

Теперь из подзапроса я должен получить ramdom id для этого я делаю

     Select
 (SELECT id FROM xyz M  WHEREM.ID=G.ID AND ROWNUM=1 order by dbms_random.value ) TOTAL_X,
count(*) from mno G where col1='M' group by col2 

Но, оракул показывает ошибку

"Missing right parenthesis".

что не так с запросом и как я могу написать этот запрос, чтобы получить случайный идентификатор. Пожалуйста, помогите.

Ответы [ 4 ]

5 голосов
/ 30 августа 2011

Даже если то, что вы сделали, было законным, это не дало бы вам желаемого результата.Фильтр ROWNUM будет применен до ORDER BY, поэтому вы просто отсортируете одну строку.

Вам нужно что-то подобное.Я не уверен, будет ли этот точный код работать с учетом коррелированного подзапроса, но суть в том, что вам нужно иметь подзапрос, содержащий ORDER BY без фильтра ROWNUM, а затем применить фильтр ROWNUM на один уровень вверх.1004 *

2 голосов
/ 30 августа 2011

Вы не можете использовать заказ в под-выборе.Это тоже не имеет значения, потому что сначала применяется нумерация строк, поэтому вы не можете повлиять на нее, используя порядок по,

[edit]

Попробовал решение.У меня нет Oracle, так что вам придется читать между опечатками.В этом случае я генерирую одно случайное значение, получаю количество записей в xyz на mno.id и генерирую последовательность для этих записей на mno.id.

Затем на более высоком уровне я фильтрую толькоте записи, индекс которых совпадает со случайным значением.Это должно дать вам случайный идентификатор из xyz, который совпадает с идентификатором в mno.

select
  x.mnoId,
  x.TOTAL_X
from
    (SELECT
      g.id as mnoId,
      m.id as TOTAL_X,
      count(*) over (partition by g.id) as MCOUNT,
      dense_rank() over (partition by g.id) as MINDEX,
      r.RandomValue
    from 
      mno g 
      inner join xyz m on m.id = g.id
      cross join (select dbms_random.value as RandomValue from dual) r
    where 
      g.col1 = 'M' 
    ) x
where
  x.MINDEX = 1 + trunc(x.MCOUNT * x.RandomValue)
1 голос
/ 30 августа 2011

Единственная разница между вашими двумя строками в том, что вы упорядочиваете ту, которая не работает, верно?Случается, что order_by не помещается во вложенный выбор.

Вы можете сделать order_by внутри предложения where, содержащего выбор.

Редактировать: @StevenV прав.

0 голосов
/ 30 августа 2011

Если вы пытаетесь сделать то, что я подозреваю, это должно сработать

Select A.Id, Count(*)
From MNO A 
Join (Select ID From XYZ M  Where M.ID=G.ID And Rownum=1 Order By Dbms_Random.Value ) B On (B.ID = A.ID)
GROUP BY A.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...