2012-03-26 28 views
2

テーブルとカラムの名前を知らずに、テーブルとカラムの名前を取得してから、与えられたテーブルをクエリします。テーブルのデータに基づくクエリテーブルとカラム

Itemテーブル:

Item_id, Item_type, 
================= 
1 box 
2 book 
3 box 

Bookテーブル:

Item_id, title,  author 
=========================== 
2 'C# Programer', 'Joe' 

Boxテーブル:

Item_id, Size 
===================== 
1, 'Large' 
3, 'X Large' 

私は次のようであるOracleデータベーススキーマを持っています

Column_mappingテーブル

Item_type, column_name, display_order 
===================================== 
box,  Size, 1 
book,  title, 1 
book,  author 2 

Table_mapping表:私は次のような結果のようなもの与えるSQL文たい

Item_type, Table_name 
======================== 
box,  Box 
book,  Book 

Item_id, Item_type column1 column2 
==================================== 
1, box,  'Large',  <null> 
2, book,  'C# Programer', 'Joe' 
3, box,  'X Large',  <null> 

私は簡略化されたクエリを試してみました

select * 
from 
    (select Table_name 
    from Table_mapping 
    where Item_type = 'box') 
where 
    Item_id = 1; 

私はITEM_IDが無効な識別子

があるというエラーが出ると私は

select * 
from 
    (select Table_name 
    from Table_mapping 
    where Item_type = 'box'); 

をしようとした場合、私はちょうど

Table_name 
=========== 
Box 

私は続行するかどうかはわかりません取得します。

答えて

0

基本的に2つの別々のクエリです。 1つはボックス用、もう1つは書籍用です。共用体を使用して結果セットをマージすることができます。

select i.Item_id, i.Item_type, b.size, null 
from Item i inner join Box b on i.Item_id=b.Item_id 
where i.Item_type = "box" 
UNION 
select i.Item_id, i.Item_type, b.title, b.author 
from Item i inner join Book b on i.Item_id=b.Item_id 
where i.Item_type = "book" 
+0

を使用する必要があるだろうcolumn_mapping場合は、このSQLFiddle

で仕事を参照してください。ストアドプロシージャを使用する必要があります。 – barsju

0

ORACLEでは、実際にはデータ・ディクショナリに表名と列名が格納されているため、これらのデータを個別に管理する必要はありません。テーブル名を取得するには、これを試してみてください:

SELECT table_name FROM user_tables; 

次に、各テーブルの列を取得するには、この操作を行います。

SELECT column_name FROM user_tab_columns WHERE table_name = 'MYTABLE'; 

あなたがそれを行うならば、あなたが実行するためにストアドプロシージャを作成する必要があります動的SQL。私はあなたがプレーンバニラのクエリでこれを行うことはできないと思います。

3

一つの方法は、両方のテーブルに参加して、あなたのデータセットは、あなたが参加にフィルタを追加することができますどのように大規模に応じて、テーブル

SELECT 
    i.Item_id, 
    i.Item_type, 
    COALESCE(b.title, bx.size) column1, 
    b.author column2 
FROM 
    Item i 
    LEFT JOIN Book b 
    ON i.item_id = b.item_id 
    LEFT JOIN Box bx 
    ON i.item_id = bx.item_id 

のいずれかからのデータを含めることができ、列にCOALESCEを使用することです例えば

LEFT JOIN Book b 
    ON i.item_id = b.item_id 
     and i.item_type = 'book' 
    LEFT JOIN Box bx 
    ON i.item_id = bx.item_id 
     and i.item_type = 'box' 

あなたはtable_mapping内のデータに基づいて何かをしたかったのか、このダイナミックなあなたにしたい場合は、動的SQL

+0

これは私が必要とするものではありません。 table_mappingには約15〜20個のテーブルがあり、異なるクライアントでは異なるテーブルになります。だから、私はtable_mappingとcolumn_mappingのデータに何か基盤が必要です。ですから、私はPL/SQLソリューションを検討しています。 SQLFiddleリンクに感謝します。 – dlb

関連する問題