используя подзапрос вместо tablename

Table Meta: ------------------------------------- type tab_name new tab_news sports tab_sps Table tab_news ------ id Table tab_sps ------------------- id xx 

Теперь я хочу использовать

 SELECT id FROM (SELECT tab_name FROM Meta WHERE type = 'news'); 

Но это не работает, никаких идей?

SQL не поддерживает переменную / etc для имени таблицы – единственный способ поддержать то, что вы просите, используя динамический SQL:

 FOR i IN (SELECT tab_name FROM META m WHERE m.type = ?) LOOP EXECUTE IMMEDIATE 'SELECT * FROM '|| i.tab_name ||''; END LOOP; 

Структура синтаксиса, которую вы пытаетесь использовать, не делает то, что вы хотите. То, что появляется в предложении FROM, представляет собой набор данных. Это может быть таблица или представление. В вашем случае набор данных является подмножеством «Мета»; в частности столбец «tab_name» для строк с типом «новости».

 SELECT id FROM (SELECT tab_name FROM Meta WHERE type = 'news'); 

SQL в основном ориентирован на набор. Кажется, вам нужно, чтобы «tab_name» возвращало «указатель» или ссылку на набор данных. Это предполагает более объектно-ориентированный подход. Вместо имени table_, выбор из Meta возвратит экземпляры объекта, и оболочка будет использовать метод для этого объекта для извлечения деталей. Это было бы больше

 SELECT tab_name.getId() FROM Meta Where type = 'news'; 

Но мне нужно было бы описать проблему «бизнес-терминов», прежде чем пытаться угадать, как выглядят структуры объектов.

Я не верю, что то, что вы пытаетесь достичь, возможно. Если вы работаете с языком программирования с этими данными, вы можете сначала вернуть значение подзапроса, а затем построить новый оператор SQL для требуемого запроса. Однако построение динамического запроса внутри SQL, как это, кажется, не представляется возможным.

Я думаю, вам нужно сделать шаг назад и посмотреть на логику базы данных. Должен быть другой способ сделать это. Например, поскольку каждая таблица должна иметь один и тот же макет, возможно, вы могли бы объединить все, а затем отфильтровать данные только по своему желанию. Вы можете сделать это во время выполнения с подзапросом. Этот процесс будет иметь значительные накладные расходы, если он масштабируется до значительных, но может решить вашу проблему с корнем. В принципе, переосмыслите свой дизайн. Существует способ достижения конечной цели, но это не тот путь.

Попробуйте наложить псевдоним подзапроса.

 select * from (select tab_name from Meta where type='news') as my_sub_query;