Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不在列表中的表的SQL查询_Sql_Oracle_Select - Fatal编程技术网

不在列表中的表的SQL查询

不在列表中的表的SQL查询,sql,oracle,select,Sql,Oracle,Select,我执行此查询以获取所有表- SELECT table_name FROM user_tables 这返回了100个结果。我现在执行这个查询,以根据特定条件获取表列表 select distinct table_name from all_tab_columns where column_name = 'my_column_id' order by table_name 这返回了66行。是否有一个查询,我可以从中获取剩余的34个表?根据我认为您的请求,使用UNION ALL,然后执行相反的wh

我执行此查询以获取所有表-

SELECT table_name FROM user_tables
这返回了100个结果。我现在执行这个查询,以根据特定条件获取表列表

select distinct table_name
from all_tab_columns
where column_name = 'my_column_id'
order by table_name

这返回了66行。是否有一个查询,我可以从中获取剩余的34个表?

根据我认为您的请求,使用
UNION ALL
,然后执行相反的
where
子句

SELECT DISTINCT table_name 
FROM all_tab_columns 
WHERE column_name = 'my_column_id' 
ORDER BY table_name
UNION ALL
SELECT DISTINCT table_name 
FROM all_tab_columns 
WHERE column_name != 'my_column_id' 
ORDER BY table_name
或者,如果您只需要34,您可以使用
而不是
并使用第一个查询

SELECT DISTINCT table_name 
FROM all_tab_columns 
WHERE table_name NOT IN (SELECT table_name 
                         FROM all_tab_columns 
                         WHERE column_name = 'my_column_id' )
ORDER BY table_name

根据我认为你的要求,使用一个
UNION ALL
,然后使用相反的
WHERE
子句

SELECT DISTINCT table_name 
FROM all_tab_columns 
WHERE column_name = 'my_column_id' 
ORDER BY table_name
UNION ALL
SELECT DISTINCT table_name 
FROM all_tab_columns 
WHERE column_name != 'my_column_id' 
ORDER BY table_name
或者,如果您只需要34,您可以使用
而不是
并使用第一个查询

SELECT DISTINCT table_name 
FROM all_tab_columns 
WHERE table_name NOT IN (SELECT table_name 
                         FROM all_tab_columns 
                         WHERE column_name = 'my_column_id' )
ORDER BY table_name

使用不在

select distinct table_name 
from all_tab_columns 
where table name not in
(
select table_name
from all_tab_columns 
where column_name = 'my_column_id'
)
order by table_name;

值得注意的是,
not exists
的速度更快,但是在一个只有几千行的数据集上,一个
not in
就可以了(并且作为一个概念更容易理解)

使用一个
not in

select distinct table_name 
from all_tab_columns 
where table name not in
(
select table_name
from all_tab_columns 
where column_name = 'my_column_id'
)
order by table_name;

值得注意的是,
not exists
速度更快,但是在一个只有几千行的数据集上,
not in
就可以了(作为一个概念更容易理解)

一种方法是使用
not exists

select table_name 
from user_tables t
where not exists(
    select table_name 
    from all_tab_columns c
    where column_name='my_column_id' 
    and t.table_name = c.table_name
)
order by table_name;

一种方法是使用
不存在

select table_name 
from user_tables t
where not exists(
    select table_name 
    from all_tab_columns c
    where column_name='my_column_id' 
    and t.table_name = c.table_name
)
order by table_name;

只需使用
NOT EXISTS
返回每个没有该名称的列的表:

SELECT table_name
FROM user_tables ut
WHERE NOT EXISTS (select table_name
                  from all_tab_columns atc
                  where atc.column_name = 'my_column_id'
                    and ut.table_name = atc.table_name)
您还可以使用
以外的方法组合两个原始查询:

SELECT table_name
FROM user_tables ut
EXCEPT
select table_name
from all_tab_columns
where column_name = 'my_column_id'

只需使用
NOT EXISTS
返回每个没有该名称的列的表:

SELECT table_name
FROM user_tables ut
WHERE NOT EXISTS (select table_name
                  from all_tab_columns atc
                  where atc.column_name = 'my_column_id'
                    and ut.table_name = atc.table_name)
您还可以使用
以外的方法组合两个原始查询:

SELECT table_name
FROM user_tables ut
EXCEPT
select table_name
from all_tab_columns
where column_name = 'my_column_id'

如果要在一个查询中查询所有数据:

SELECT t.table_name,
       CASE WHEN c.table_name IS NOT NULL THEN 1 ELSE 0 END
         AS has_column
FROM   user_tables t
       LEFT OUTER JOIN
       user_tab_columns c
       ON (    t.table_name  = c.table_name
           AND c.column_name = 'MY_COLUMN_NAME' );
(注意:默认情况下,Oracle会将表名和列名转换为大写[以使用户避免区分大小写的问题],除非您将它们括在双引号中;因此,您可能希望列名为大写。在可能的情况下,您应该避免在查询中使用双引号,因为这会导致混淆。)

如果只需要不匹配的列:

SELECT table_name
FROM   user_tables
MINUS
SELECT table_name
FROM   user_tab_columns
WHERE  column_name = 'my_column_id';


如果要在一个查询中查询所有数据:

SELECT t.table_name,
       CASE WHEN c.table_name IS NOT NULL THEN 1 ELSE 0 END
         AS has_column
FROM   user_tables t
       LEFT OUTER JOIN
       user_tab_columns c
       ON (    t.table_name  = c.table_name
           AND c.column_name = 'MY_COLUMN_NAME' );
(注意:默认情况下,Oracle会将表名和列名转换为大写[以使用户避免区分大小写的问题],除非您将它们括在双引号中;因此,您可能希望列名为大写。在可能的情况下,您应该避免在查询中使用双引号,因为这会导致混淆。)

如果只需要不匹配的列:

SELECT table_name
FROM   user_tables
MINUS
SELECT table_name
FROM   user_tab_columns
WHERE  column_name = 'my_column_id';


在比较
USER\u表
USER\u选项卡_列
时,通常应小心,如下所示

select count(*) cnt from user_tables;

       CNT
----------
         1 

select  count(distinct table_name) cnt
from all_tab_columns
where column_name = 'my_column_id';   

       CNT
----------
         3
您可以看到,
USER\u TAB\u列中的表比
USER\u表中的表多


怎么可能呢?视图
用户选项卡\u列
(与其名称相反)也包含视图列,因此简单算法(减号,不在等中)
USER\u TABLES
USER\u TAB\u COLUMNS
之间的表名不总是有意义的。

在比较
USER\u TABLES
USER\u TAB\u COLUMNS
时,通常应该小心,如下所示

select count(*) cnt from user_tables;

       CNT
----------
         1 

select  count(distinct table_name) cnt
from all_tab_columns
where column_name = 'my_column_id';   

       CNT
----------
         3
您可以看到,
USER\u TAB\u列中的表比
USER\u表中的表多


怎么可能呢?视图
USER\u TAB\u列
(与其名称相反)也包含视图列,因此
USER\u表
USER\u TAB\u列
之间的表名的简单算法(减号,不在etc中)并不总是有意义的。

,您的第二个选项是错误的,如果表有多个列,它将返回包含该列的表。@JohnHC-woops。已修复:)不需要在子查询中使用该区别。不,您的第二个选项是错误的,如果表有多个列,则仍将返回包含该列的表。@JohnHC woops。修正:)在子查询中不需要区分。更重要的是,
不存在
也是“空安全的”。(如果子查询返回NULL,许多人会对
不在
中的行为感到惊讶。)@jarlh
TABLE_NAME
在Oracle的字典视图中不能
NULL
。如果在外部查询中使用
user_tables
,则不需要
DISTINCT
关键字。@MT0,这是一条一般性建议,何时使用
不存在
而不是
不在
中!更重要的是,
不存在
也是“空安全的”。(如果子查询返回NULL,许多人会对
不在
中的行为感到惊讶。)@jarlh
TABLE_NAME
在Oracle的字典视图中不能
NULL
。如果在外部查询中使用
user_tables
,则不需要
DISTINCT
关键字。@MT0,这是一条一般性建议,何时使用
不存在
而不是
不在
中!