请问如何用一条sql语句实现两个表的并集查询?

时间:2022-04-15 01:02:45
      这其实是一个折磨了我很久的sybase问题,但sql大同小异,
希望能有大虾解脱我。
      问题举例描述如下:
      库中有两表 a_message , b_message 先假定两表结构完全
一样,现要对其进行统计满足某条件的所有记录
      可用 select * from a_message  where ...
          union
          select * from b_message  where ...
   
      统计总记录数
      可用 select  (select count(*) from a_message) +
                   (select count(*) from b_message)
    
      可以看出我必须用两条select语句,我也过用 distinct 及
      不跟关联条件的两表查询语句
           e.g.   select distinct .. from a_message ,b_message
      等各种组合,但这种方法运行效率很低,(我认为它会先生成一个
      笛卡儿集),所以我想知道有没有一种办法可以用一条select 语句实
      现两个表的交,并,差运算,
           我现在认为select 也是一种运算,它的运算结果是一个集合,
      有时集合只有一个值,因而迷惑住了别人,因而才可以有如下语句
          select ...  union  select ...
           但表跟集合又是什么关系?select .. from (select ...)
      不正确,即表明 select  不能从集合中取数,只可从表中取数,
      请问个位大虾是如何
      看此问提的 ?  小章 这厢有礼了。
           
     

6 个解决方案

#1


我有一个想法,不知道这样行不行。
1、建一个空表C,表内字段只有需要查询的条件和二个标志字段(分别标志来自A表还是B表);
2、将A表的相关内容插入C表,然后填上相应的标志符A;
3、将B表的相关内容插入C表,然后填上相应的标志符B,对于表的已有的记录只需填上标志符B;
4、我们现在可以根据相应的标志符来求相应的运算。
我是一个数据库新手,也不知说的对不对,请各位多多指教。

#2


 Union是表间集合合并的最佳方法,Union合并后的表成为一个新表,你可在新表进行查询,如:
  Select Distinct * from (
      Select * from a_message
      Union
      Select * from b_message )
  这样不是很一目了然吗?
  From子句后跟的须是数据表,当然这个数据表可以是表名,也可以是子查询产生的临时表。而从一个集合中选择数据的情况并不是一种实用的方式,它完全可以用SQL函数来替代。

#3


交集就是两表的join 连接查询
如:SELECT ... FROM a JOIN b ON a.id=b.id
并集可用Union
差集可用空值判断。
如:SELECT ... FROM a LEFT JOIN b ON a.id=b.id WHERE isNull(b.id)=true 

#4


我试过gxg8816的方法,可是觉得在数据量比较大的时候,效率低了一点,

#5


即要语句少,又要检索的数据量比较小,好象是不可能的。我认为用两条语句比较好。

#6


在db2和oracle都可以支持在数据集上面查询,
db2可以写作
select (select ... ) from ....
oracle可以写做
select a.b ....from (select hello b ... from ...) a ...

#1


我有一个想法,不知道这样行不行。
1、建一个空表C,表内字段只有需要查询的条件和二个标志字段(分别标志来自A表还是B表);
2、将A表的相关内容插入C表,然后填上相应的标志符A;
3、将B表的相关内容插入C表,然后填上相应的标志符B,对于表的已有的记录只需填上标志符B;
4、我们现在可以根据相应的标志符来求相应的运算。
我是一个数据库新手,也不知说的对不对,请各位多多指教。

#2


 Union是表间集合合并的最佳方法,Union合并后的表成为一个新表,你可在新表进行查询,如:
  Select Distinct * from (
      Select * from a_message
      Union
      Select * from b_message )
  这样不是很一目了然吗?
  From子句后跟的须是数据表,当然这个数据表可以是表名,也可以是子查询产生的临时表。而从一个集合中选择数据的情况并不是一种实用的方式,它完全可以用SQL函数来替代。

#3


交集就是两表的join 连接查询
如:SELECT ... FROM a JOIN b ON a.id=b.id
并集可用Union
差集可用空值判断。
如:SELECT ... FROM a LEFT JOIN b ON a.id=b.id WHERE isNull(b.id)=true 

#4


我试过gxg8816的方法,可是觉得在数据量比较大的时候,效率低了一点,

#5


即要语句少,又要检索的数据量比较小,好象是不可能的。我认为用两条语句比较好。

#6


在db2和oracle都可以支持在数据集上面查询,
db2可以写作
select (select ... ) from ....
oracle可以写做
select a.b ....from (select hello b ... from ...) a ...