不在列表中的表的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,许多人会对不在
中的行为感到惊讶。)@jarlhTABLE_NAME
在Oracle的字典视图中不能NULL
。如果在外部查询中使用user_tables
,则不需要DISTINCT
关键字。@MT0,这是一条一般性建议,何时使用不存在
而不是不在
中!更重要的是,不存在
也是“空安全的”。(如果子查询返回NULL,许多人会对不在
中的行为感到惊讶。)@jarlhTABLE_NAME
在Oracle的字典视图中不能NULL
。如果在外部查询中使用user_tables
,则不需要DISTINCT
关键字。@MT0,这是一条一般性建议,何时使用不存在
而不是不在
中!