использование подзапроса вместо имени таблицы - PullRequest
3 голосов
/ 09 мая 2011
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');

Но это не работает, какие-нибудь идеи?

Ответы [ 4 ]

2 голосов
/ 09 мая 2011

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

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

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

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

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

2 голосов
/ 09 мая 2011

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;
0 голосов
/ 09 мая 2011

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

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

0 голосов
/ 09 мая 2011

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

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