2014-10-27 1 views
2

У меня есть 4 таблицы, которые имеют 5 столбцов. Я хочу получить последние десять лучших строк для этих таблиц и получить их.
Как я могу это сделать? Я пробовал использовать простую команду соединения, но вместо 5 столбцов я получаю 20 столбцов! каждая таблица имеет свой собственный псевдоним имени столбца! но я хочу, чтобы иметь 5 столбцов таблицы, которая содержит все те 10 лучших.Как получить десятку строк разных таблиц в оракуле?

Update:

fetch FIRST 10 ROWS ONLY 

Команда возвращает 10 первых записей, а не самые последние из них , когда я запускаю следующую команду, например:

select * from tblTest order by ID FETCH First 3 ROWS Only; 

Я получаю

1 Ali 
2 Jacob 
3 Chris 

Где я действительно нуждался

18 Fatima 
19 Mary 
20 Catherina 

Как я могу достичь такого?

+0

Просто, чтобы быть уверенным - вы хотите, чтобы верхние 10 строк или верхние 10 из каждой таблицы? – Mureinik

+0

Я хочу, чтобы верхние 10 строк – Breeze

ответ

3

В Oracle 12c, вы можете использовать TOP-N запрос:

SQL> select * from(
    2 (select deptno from emp 
    3 ORDER BY deptno 
    4 fetch FIRST 10 ROWS ONLY) 
    5 UNION all 
    6 (select deptno from emp 
    7 ORDER BY deptno 
    8 fetch FIRST 10 ROWS ONLY) 
    9 ) 
10/

    DEPTNO 
---------- 
     10 
     10 
     10 
     20 
     20 
     20 
     20 
     20 
     30 
     30 
     10 

    DEPTNO 
---------- 
     10 
     10 
     20 
     20 
     20 
     20 
     20 
     30 
     30 

20 rows selected. 

В отличие от ROWNUM, вам не нужно беспокоиться о ORDER.

Обновление Что касается последних записей в порядке

Использование DESC в порядке.

SQL> SELECT * 
    2 FROM(
    3 (SELECT deptno FROM emp ORDER BY deptno DESC 
    4 FETCH FIRST 3 ROWS ONLY 
    5 ) 
    6 UNION ALL 
    7 (SELECT deptno FROM emp ORDER BY deptno DESC 
    8 FETCH FIRST 3 ROWS ONLY 
    9 )) 
10/

    DEPTNO 
---------- 
     30 
     30 
     30 
     30 
     30 
     30 

6 rows selected. 

SQL> 
+0

обновил вопрос. – Breeze

+0

Вам нужны последние записи в заказе? Если да, используйте 'DESC' в порядке. См. Мое обновление в ответ. –

+0

Спасибо, но это даст мне записи в виде 20,19,18 заказа, в то время как я хочу, чтобы это было 18,19,20. – Breeze

3

Вы можете использовать union all, чтобы получить все строки последовательно, а затем взять топ-10:

SELECT col1, col2, col3, col4, col5 
FROM (SELECT col1, col2, col3, col4, col5 
     FROM (SELECT col1, col2, col3, col4, col5 FROM table1 
       UNION ALL 
       SELECT col1, col2, col3, col4, col5 FROM table2 
       UNION ALL 
       SELECT col1, col2, col3, col4, col5 FROM table3 
       UNION ALL 
       SELECT col1, col2, col3, col4, col5 FROM table4) 
     ORDER BY col1, col2, col3, col4, col5) 
WHERE rownum <= 10 
+0

не повлияли на базу данных? я имею в виду, не будет ли 4 индивидуальных выбора лучше? – Breeze

+0

Если вы хотите, чтобы база данных отфильтровывала результаты первой десятки, она должна быть в одном запросе. Стоит отметить, однако, что любой ряд в первой десятке должен быть также в верхней десятке лучших топ-топ. Возможно, стоит добавить эту фильтрацию к каждому отдельному запросу, но вам нужно сравнить ее с вашими собственными данными, чтобы убедиться, что она повышает производительность или нет. – Mureinik

+0

Большое спасибо – Breeze

Смежные вопросы