我们需要根据模式名和表名的组合来查询ALL_TABLES视图。
有两个模式"A“和" B”,并且它们都有相同的表"TAB1“,这里我的要求是选择与模式A关联的表,而不是模式B。
目前,我们正在对表名和所有者名进行拼接操作,如下所示
在单个查询中将有多个所有者和表名组合可用
select table_name from all_tables where concat(owner_name,table_name) in ('ATAB1','ATAB2','BTAB2','CTAB1')
select table_name from all_tables where concat(owner_name,table_name) not in ('ATAB1','ATAB2','BTAB2','CTAB1')这里有三个模式A、B和C,以及它们各自的表名组合
如果不使用CONCAT函数,我们如何才能获得相同的结果呢?
发布于 2013-01-27 02:29:19
WHERE 0=1
OR (owner_name = 'A' AND table_name = 'T1')
OR (owner_name = 'B' AND table_name = 'T2')
OR (owner_name = 'A' AND table_name = 'T3')奇怪的0=1只是为了便于维护和/或代码生成,使下面的代码行在语法上完全相同。优化器会将其删除。
发布于 2013-01-27 02:56:42
您可以将需要匹配的字符串值排列到一个虚拟表中,然后在连接中使用该表作为筛选器:
SELECT t.*
FROM all_tables t
INNER JOIN (
SELECT 'A' AS owner_name, 'TAB1' AS table_name FROM DUAL
UNION ALL SELECT 'A', 'TAB2' FROM DUAL
UNION ALL SELECT 'B', 'TAB2' FROM DUAL
UNION ALL SELECT 'C', 'TAB1' FROM DUAL
) s
ON t.owner_name = s.owner_name
AND t.table_name = s.table_name
;我希望这会给查询规划器提供比你现在的方法更多的优化空间。
发布于 2013-01-27 03:13:03
Oracle允许在一个IN条件中包含多个列(有关更多示例,请参阅documentation )。
select table_name
from all_tables
where (owner_name, table_name) in
(('A','TAB1'), ('A','TAB2'), ('B','TAB2'), ('C','TAB1'))就性能而言,这可能等同于usr's answer。
https://stackoverflow.com/questions/14539821
复制相似问题