Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Oracle11g - Fatal编程技术网

Sql 从匹配记录中删除并添加不相等的数据

Sql 从匹配记录中删除并添加不相等的数据,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有以下表格: 表a: Name T1 T2 T3 T4 表b: Name T1 T2 T3 T4 T5 T6 我需要从表a中选择全部,并从表b中添加表a中没有的内容,结果如下: T1 T2 T3 T4 T5 T6 感谢您的帮助这里有一种方法: Select distinct Name from ( select Name from Table A UNION ALL select Name from Table B

我有以下表格:

表a:

Name 

T1      
T2     
T3
T4
表b:

Name 
T1      
T2     
T3
T4
T5
T6
我需要从表a中选择全部,并从表b中添加表a中没有的内容,结果如下:

T1      
T2     
T3
T4
T5
T6

感谢您的帮助这里有一种方法:

Select distinct Name
from (
select Name from Table A
UNION ALL
select Name from Table B
)

有一种方法可以做到这一点:

Select distinct Name
from (
select Name from Table A
UNION ALL
select Name from Table B
)

如果您想要两个表中的所有唯一名称,请使用
UNION

select name from table_a
union
select name from table_b;

如果您想要两个表中的所有唯一名称,请使用
UNION

select name from table_a
union
select name from table_b;
还有一种方法:

select ta.name from ta
union all
select tb.name from tb
left join  ta
on tb.name = ta.name
where ta.name is null
还有一种方法:

select ta.name from ta
union all
select tb.name from tb
left join  ta
on tb.name = ta.name
where ta.name is null

我会用一个反连接(一个不在条件下)来实现这一点。如下文所述,如果表
a
中的该列中可能出现
NULL
(在这种情况下,应使用
不存在
的条件写入反连接),则它将无法正常工作。我假设该列为
非空

反联接比联接快,因为只要在
a
中也找到表
b
中的值,表
b
中该行的联接就会停止,处理将移到下一行。在连接中,连接继续,不存在此类短路

Oto的解决方案使用连接而不是反连接。然而,我相信Oracle查询优化器在这个简单的例子中认识到,反连接就足够了,它将重写查询以使用反连接。您可以通过在两个查询上运行Explain Plan来验证这一点。尽管如此,在一个类似但复杂得多的问题中,优化器可能无法“看到”这条捷径;这就是为什么我认为最好显式地编写反连接(和半连接,其中我们在中使用
,或
存在
条件),而不是依赖优化器

查询应该是

select name from a
union all
select name from b where name not in ( select name from a );

我会用一个反连接(一个不在条件下)来实现这一点。如下文所述,如果表
a
中的该列中可能出现
NULL
(在这种情况下,应使用
不存在
的条件写入反连接),则它将无法正常工作。我假设该列为
非空

反联接比联接快,因为只要在
a
中也找到表
b
中的值,表
b
中该行的联接就会停止,处理将移到下一行。在连接中,连接继续,不存在此类短路

Oto的解决方案使用连接而不是反连接。然而,我相信Oracle查询优化器在这个简单的例子中认识到,反连接就足够了,它将重写查询以使用反连接。您可以通过在两个查询上运行Explain Plan来验证这一点。尽管如此,在一个类似但复杂得多的问题中,优化器可能无法“看到”这条捷径;这就是为什么我认为最好显式地编写反连接(和半连接,其中我们在
中使用
,或
存在
条件),而不是依赖优化器

查询应该是

select name from a
union all
select name from b where name not in ( select name from a );

表a中有重复的吗?如果表a中有重复项,是否希望结果也有相同的重复项?表b怎么样?两个表中都没有重复项。表a中有重复项吗?如果表a中有重复项,是否希望结果也有相同的重复项?那么表b呢?两个表中都没有重复项。虽然准确,但这是不必要的复杂,因为一个简单的
联合
会做同样的事情。谢谢Jeremy,还有其他方法吗?它们的速度不同,都是为了不同的方法。感谢mathguy:谢谢,我会测试它,看起来不错。虽然准确,但这是不必要的复杂,因为一个简单的
union
做同样的事情。谢谢Jeremy,有没有其他方法,有明显的慢感谢所有不同的方法。谢谢,我会测试一下,看起来不错。这可能是最快的方法。这可能是最快的方法。