2

我们需要根据模式名称和表名称的组合查询 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 函数的情况下获得相同的结果?

4

3 回答 3

2
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-26T18:29:18.753 回答
1

您可以将需要匹配的字符串值排列到虚拟表中,然后在连接中使用该表作为过滤器:

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-26T18:56:41.667 回答
1

Oracle 允许在一个条件中使用多个列(有关更多示例,IN请参阅文档)。

select table_name
  from all_tables
 where (owner_name, table_name) in
         (('A','TAB1'), ('A','TAB2'), ('B','TAB2'), ('C','TAB1'))

就性能而言,这可能等同于usr 的答案

于 2013-01-26T19:13:03.370 回答