Можно ли выбрать из нескольких таблиц, имена которых являются результатом подзапроса? - PullRequest
4 голосов
/ 30 июня 2010

У меня есть несколько таблиц с одинаковой структурой, и я хочу сделать выбор в группе из них.

Вместо того, чтобы просто делать цикл для всех этих таблиц, я хотел бы поместить подзапрос после ОТ основного запроса.

Возможно или не получится?

Спасибо!

(с использованием Oracle)


Дополнительная информация: у меня нет названия таблицы сразу! Они хранятся в другой таблице. Возможно ли иметь подзапрос, который я мог бы поставить после ОТ моего основного запроса?

Ответы [ 2 ]

11 голосов
/ 30 июня 2010

"У меня нет названия стола сразу! Они хранятся в другом стол "

Oracle не делает такого рода вещи в SQL. Вам нужно будет использовать PL / SQL и собрать динамический запрос.

create or replace function get_dynamic_rows
    return sys_refcursor
is
    stmt varchar2(32767) := null;
    return_value sys_refcursor;
begin
    for r in ( select table_name from your_table ) 
    loop
        if stmt is not null then
           stmt := stmt||' union all ';
        end if;
        stmt := stmt||'select * from '||r.table_name;
    end loop;
    open return_value for stmt;
    return return_value;

end;
/

Это соберет запрос, подобный этому

select * from table_1 union all select * from table_2

UNION ALL - это оператор набора, который объединяет вывод нескольких запросов в один набор результатов без удаления дубликатов. Столбцы в каждом запросе должны совпадать по числу и типу данных.

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

Ref Cursors - это PL / SQL-проекты, эквивалентные JDBC или .Net ResultSets. Узнайте больше .

4 голосов
/ 30 июня 2010

Конечно, просто объедините их вместе:

select * from TableA
union all
select * from TableB
union all
select * from TableC

Вы можете объединить в подзапросе:

select *
from (
    select * from TableA
    union all
    select * from TableB
) sub
where col1 = 'value1'

Используйте union, если вас интересуют только уникальные строки, и union all, если вам нужны все строки, включая дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...