Вы ожидаете, что Oracle выполнит подзапрос один раз в строке (что и делает MySQL).Однако, похоже, вы столкнулись с побочным эффектом оптимизации Oracle.Нет корреляции между основным запросом и скалярным подзапросом, поэтому Oracle решает разложить вложенный запрос, выполнить его один раз и присоединить результат к основному запросу.
Чтобы получить требуемые результаты, у вас есть параопции.Одним из них является отключение unnesting с подсказкой NO_UNNEST
.
select t1.a
, ( select d from ( select /*+ NO_UNNEST */ d from for_test_two
order by dbms_random.value ) where rownum = 1) d
from for_test_one t1
/
В качестве альтернативы вы можете переписать свой запрос для использования встроенного представления, а не скалярного подзапроса.
select t1.a
, t2.d
from ( select a, rownum as rn
from for_test_one) t1
join ( select d, rownum as rn
from ( select d from for_test_two
order by dbms_random.value() ) ) t2
on t1.rn = t2.rn
order by t1.rn
/
Предупреждение : NO_UNNEST
Решение не работает на демонстрации SQL Fiddle ( найдите его здесь ).Не уверен, почему, синтаксис выглядит правильно.Попробуйте это в своей среде или просто используйте второй подход, который определенно работает.