在不知道表和列的名称的情况下,我想查询数据库检索表名和列名,然后查询给定的表。
我有一个类似于以下内容的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 :(得分:3)
一种方法是连接两个表,然后在可以包含来自任一表的数据的列上使用coalesce
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
根据数据集的大小,您可能希望在连接上添加过滤器,例如
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
答案 1 :(得分:0)
基本上它是两个单独的查询。一个用于盒子,一个用于书籍。您可以使用union将结果集合并在一起。
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"
答案 2 :(得分:0)
ORACLE实际上将表名和列名存储在其数据字典中,因此您无需单独维护这些数据。试试这个来获取表名:
SELECT table_name FROM user_tables;
然后执行此操作以获取每个表的列:
SELECT column_name FROM user_tab_columns WHERE table_name = 'MYTABLE';
一旦这样做,您将需要创建一个存储过程以执行动态SQL。我不认为你可以用普通的查询来做到这一点。