2012-03-26 51 views
2

不知道表和列的名稱,我想查詢數據庫檢索表和列的名稱,然後查詢給定的表。基於表數據的查詢表和列

我有一個Oracle數據庫架構是這樣的:

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' 

Column_mapping

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

Table_mapping表:

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

,我想那會看到這樣的結果如下SQL語句:

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

基本上它是兩個單獨的查詢。一個是盒子,一個是書本。您可以使用聯合將結果集合並在一起。

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

如果你想使這個動態的數據做一些你需要使用存儲過程。 – barsju 2012-03-26 16:22:29

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' 

看到它在這個SQLFiddle

工作,如果你想基於在table_mapping或column_mapping你需要使用動態SQL

+0

這不是我所需要的。 table_mapping將包含大約15到20個表格,並且對於不同的客戶端來說會有所不同。所以我確實需要基於table_mapping和column_mapping中的數據。所以我在看一個PL/SQL解決方案。感謝SQLFiddle鏈接。 – dlb 2012-04-02 15:23:39