SQL从类似表中查找数据

时间:2016-09-30 12:39:27

标签: sql oracle union

我有50个具有类似结构的表格,名称为RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^product-detail/([\w-.]+)/?$ product-detail.php?e=$1 [NC,L] TABLE_1TABLE_2等。我想选择一些信息,例如TABLE_3,但我不知道哪个表包含此ID。我想我应该与这些表联合并从这个联盟中查询,但我担心这不是最好的解决方案。有人能帮助我吗?

5 个答案:

答案 0 :(得分:0)

要查找包含字段CRM_ID的表,您可以使用:

select TABLE_NAME
from SYS.ALL_TAB_COLUMNS
where COLUMN_NAME = 'CRM_ID'

从这里,您可以使用您的联合查询相关表格

答案 1 :(得分:0)

select 'table_1', count(*) from table_1 where CMR_ID = 100
union all
select 'table_2', count(*) from table_2 where CMR_ID = 100
[.....]

如果您有50个表,您可能需要使用一些高级文本编辑,这样您就不必输入相同的50次。

答案 2 :(得分:0)

我无法看到与UNION不同的内容,无法满足您的需求。 但是,我想避免每次需要查询表时重复所有代码,例如通过创建视图:

create view all_my_tables as
  select * from table1
  union
  select * from table2
  ...

然后

select *
from all_my_tables
where crm_id = 100

答案 3 :(得分:0)

我会

create a view table_all as 
select * from table_1 union all
select * from table_2 ...

但是我猜你有50个表,因为有一些性能原因,比如创建没有分区表的分区。如果是这种情况,你需要一些模拟索引的表,你需要有数据"排序"。然后创建包含以下内容的表:table_name,min_val,max_val: table_1,1,1000 table_2,1001,2000

和程序选择如下:

procedure sel(crmid) is
a varchar2(10);
value table%rowtype;
begin
select table_name into a from lookup where crmid between min_val and max_val;
execute immediate 'select * from ' || a || ' where crm_id = ' || crmid into value;
--do logic with value
end;

但如果没有订购数据,则需要迭代循环选择。在这种情况下使用视图。

答案 4 :(得分:0)

试试这个:

Select tmp.tablename from (
select 'table1' as tablename from table1 where CRM_ID=100 
union all
select 'table2' as tablename from table2 where CRM_ID=100
) as tmp