希望能有大虾解脱我。
问题举例描述如下:
库中有两表 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、我们现在可以根据相应的标志符来求相应的运算。
我是一个数据库新手,也不知说的对不对,请各位多多指教。
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函数来替代。
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
如: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 ...
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、我们现在可以根据相应的标志符来求相应的运算。
我是一个数据库新手,也不知说的对不对,请各位多多指教。
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函数来替代。
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
如: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 ...
db2可以写作
select (select ... ) from ....
oracle可以写做
select a.b ....from (select hello b ... from ...) a ...