3
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

4 に答える 4

2

SQLはテーブル名の変数などをサポートしていません-あなたが求めるものをサポートする唯一の手段は動的SQLを使用することです:

FOR i IN (SELECT tab_name
            FROM META m
           WHERE m.type = ?) LOOP
  EXECUTE IMMEDIATE 'SELECT * FROM '|| i.tab_name ||'';
END LOOP;
于 2011-05-09T01:45:24.157 に答える
2

あなたが使おうとしている構文構造は、あなたが望むことをしません。FROM 句に表示されるのはデータ セットです。これはテーブルまたはビューである可能性があります。あなたの場合、データセットは「メタ」のサブセットです。具体的には、「news」タイプの行の列「tab_name」。

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';

しかし、オブジェクト構造がどのように見えるかを推測する前に、問題をより「ビジネス用語」で説明する必要があります。

于 2011-05-09T02:00:28.697 に答える
0

私はあなたが達成しようとしていることが可能であるとは思わない。このデータを使用してプログラミング言語を使用している場合は、最初にサブクエリ値を返し、次に必要なクエリの新しいSQLステートメントを作成できます。ただし、このようなSQL内で動的クエリを作成することは不可能のようです。

一歩下がってデータベースロジックを確認する必要があると思います。これを行うには別の方法が必要です。たとえば、各テーブルは同じレイアウトである必要があるため、すべてを結合してから、本当に必要なものだけにデータをフィルタリングすることができます。実行時にサブクエリを使用してこれを行うことができます。このプロセスを大幅に拡張すると、かなりのオーバーヘッドが発生しますが、根本的な問題が解決する可能性があります。基本的に、あなたのデザインを再考してください。最終目標を達成する方法はありますが、それはこの道を進んでいるわけではありません。

于 2011-05-09T01:30:17.397 に答える
-1

サブクエリのエイリアスを試してください。

select * from  (select tab_name from Meta where type='news') as my_sub_query;
于 2011-05-09T01:21:30.827 に答える