第1个回答 2008-08-28
用Union没错!
Select aid, a1, a2 from [表a]
union all
Select bid, b1, b2 from [表b]
使用Union的关键点:
一、查询结果是一个数据集,它的字段名以第1个Select后面的字段列表为准,后面的Select的字段列表需要与第1个的对齐(字段个数和数据类型相同,名称无所谓)
例如如下这句,就是增加一条记录。
Select aid, a1, a2 from [表a]
union all
Select bid, b1, b2 from [表b]
Union
select 0, '111', '222'
如下会出错,因为第一个Select中的字段 111 为整型,会造成[表b]的b1字段内容强行向整型转换,转换会失败:将 varchar 值 'b11' 转换为数据类型为 int 的列时发生语法错误。
select 0, 111, '222'
Union
Select bid, b1, b2 from [表b]
二、union all中的“All”不加的话,是自动剔除重复的记录(重复的记录只保留1条),加上“All”则会保留所有数据。
---------------------------------
按问题补充:1)让查询结果添加到一张新表里面;2)按某个条件查询,比如查询出结尾为22的数据。显示a22 b22:
只需要增加几个子句就可以了:
1)将查询结果放到新表:
Select aid, a1, a2 into [新表名] from [表a]
union all
Select bid, b1, b2 from [表b]
--关键点:SELECT INTO 必须是包含 UNION 运算符的 SQL 语句中的第一个查询。
2)增加查询条件:
Select aid, a1, a2 from [表a] where a2 like '%22'
union all
Select bid, b1, b2 from [表b] where b2 like '%22'
--关键点:每个子查询都要单独增加相应的查询条件!
-----------------------
对于“超时时间已到,……”:可能原因是:1、数据量过大;2、SQL的超时设置不够长。所以你可以尝试把SQL的超时设置长一些,比如2分钟;再就是把这个Union拆成两句来分别执行:
Select aid, a1, a2 into [新表名] from [表a]
Insert into [新表名] Select bid, b1, b2 from [表b]
如果还超时,那就复杂了,可能数据量太大、其他性能、索引、等综合检查了。
对于增加自增长字段的问题,是这样的,在Select into这种方式生成新表时,是无法指定自增长字段的。所以办法就是:先建立好表,再用Insert into的方式向里面插入数据:
CREATE TABLE dbo.NewTABLE
(
Myid int NOT NULL IDENTITY (1, 1),
oid int NULL,
A varchar(50) NULL,
B varchar(50) NULL
) ON [PRIMARY]
GO
Insert into [NewTABLE](oid,A,B) Select aid, a1, a2 from [表a]
Insert into [NewTABLE](oid,A,B) Select bid, b1, b2 from [表b]
Go
----------------------------------
“单纯的查询时候定义自增列”,这个据我所知是不行的,不知SQL 2005是否有此功能。因为查询的结果总是来源于现有数据或常数,且SQL的记录是没有行号概念的。
看能否从现有数据中的某一列通过某种计算得到一个貌似自增的结果。类似:
select *, 一个公式(某列) as MyID from [tablename]本回答被提问者采纳
第2个回答 2008-08-26
select to_char(aid),to_char(a1),to_char(a2)
from a
union all
select to_char(bid),to_char(b1),to_char(b2)
from b
由于我还没想到太好的方法,教你个偷机取巧的方法。。统一它们的类型。
tochar在PL/SQL中是把数据转换成字符型,然后就可以使用union了。。。。
等我想好了再给你写别的答案,谢谢!惭愧。。。
第3个回答 2008-08-27
select aid,a1=cast(a1 as varchar(100)),a2=cast(a2 as varchar(100)) from tablea
union
select aid=bid,a1=cast(b1 as varchar(100)),a2=cast(b2 as varchar(100)) from tableb
第4个回答 2008-08-26
select * from a union all select * from b
查出来应该是6列
这样好像是不行的,你的意思是把b1,b2显示在a1,a2的位置,似乎不行,可以用一张临时表做做看
第5个回答 2008-08-26
select to_char(aid),to_char(a1),to_char(a2)
from 表a
union
select to_char(bid),to_char(b1),to_char(b2)
from 表b