一个通不过sql语句!

carlton 2003-02-25 04:30:37
----------------
Select *
From
(select * from 2002)Union all(Select * from 2003)
-----------
或写成:
-------------
Select *
From
(select * from 2002)Union all(Select * from 2003) as temp (dd,tt)

说是错误的from语句。
----------
若写成:
Select *
From
((select * from 2002)Union all(Select * from 2003) as temp (dd,tt))
则为join错误
------------

请问表达这个意思的sql语句该怎么写?
...全文
10 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xmvigour 2003-02-26
先说说你要的结果是什么 为什么一定要变成你要的那个as temp(dd,tt)
而且这并不是标准的sql
如果你要建立一个虚表
可以改成
create view temp(dd,tt)
as
select dd,tt from 2002 union all
select dd,tt from 2003

或者是
select* from (
select dd,tt from 2002 union all
select dd,tt from 2003 ) temp

回复
tangshancheng 2003-02-25
为什么要加 as temp(dd,tt)

本来语句
select dd,tt from 2002
union all
select dd,tt from 2003
就会返回记录集,其字段以第一个select语句为准,
返回的记录集肯定有两个字段:dd、tt


UNION 运算符使用准则
使用 UNION 运算符时请遵循以下准则:
· 在使用 UNION 运算符组合的语句中,所有选择列表的表达式数目必须相同(列名、算术表达式、聚合函数等)。
· 在使用 UNION 组合的结果集中的相应列、或个别查询中使用的任意列的子集必须具有相同数据类型,并且两种数据类型之间必须存在可能的隐性数据转换,或提供了显式转换。例如,在 datetime 数据类型的列和 binary 数据类型的列之间不可能存在 UNION 运算符,除非提供了显式转换,而在 money 数据类型的列和 int 数据类型的列之间可以存在 UNION 运算符,因为它们可以进行隐性转换。
· 用 UNION 运算符组合的各语句中对应的结果集列出现的顺序必须相同,因为 UNION 运算符是按照各个查询给定的顺序逐个比较各列。
示例如下:
table3 table4
a b -c a b
int char(4) char(4) char(4) float
--- ------- ------- ------- -------
1 abc jkl jkl 1.000
2 def mno mno 5.000
3 ghi pqr

执行以下查询:
SELECT a, b FROM table3
UNION
SELECT b, a FROM table4
下面是结果集:
a b
-------- -----
1.000000 abc
2.000000 def
3.000000 ghi
1.000000 jkl
5.000000 mno
在 UNION 操作中组合不同的数据类型时,这些数据类型将使用数据类型优先级的规则进行转换。在前面的示例中,int 值转换成 float 值,因为 float 类型的优先权比 int 类型高。有关更多信息,请参见数据类型的优先顺序。
以下查询将产生错误信息,因为相应列的数据类型不兼容:
SELECT b, c FROM table3
UNION
SELECT a, b FROM table4
· 通过 UNION 生成的表中的列名来自 UNION 语句中的第一个单独的查询。若要用新名称引用结果集中的某列(例如在 ORDER BY 子句中),必须按第一个 SELECT 语句中的方式引用该列:
· SELECT city AS Cities FROM stores_west
· UNION
· SELECT city FROM stores_east
· ORDER BY city
回复
carlton 2003-02-25
不加括号为“from 字句错误”
加括号则为“联合查询错误”
--上回复中加括号应为:
(select dd,tt from 2002 union all
select dd,tt from 2003)
as temp(dd,tt)
少打了个括号
回复
carlton 2003-02-25
谢谢各位的回答!
from字句中的
select dd,tt from 2002 union all
select dd,tt from 2003
是可以通过的,但若加上一部分:as temp(dd,tt),为:
select dd,tt from 2002 union all
select dd,tt from 2003
as temp(dd,tt)
或加括号
(select dd,tt from 2002 union all
select dd,tt from 2003
as temp(dd,tt)
则都有错误

正在想办法。
谢谢各位!

回复
redkey 2003-02-25
select * from 2002
Union all
Select * from 2003
这样写就可以
回复
xmvigour 2003-02-25
试试
select dd,tt from 2002 union all
select dd,tt from 2003
如果还出错 就说明你的数据库不支持union all
不一定每个数据库都实现标准的sql-92
回复
tangshancheng 2003-02-25
UNION 运算符使用准则
使用 UNION 运算符时请遵循以下准则:
· 在使用 UNION 运算符组合的语句中,所有选择列表的表达式数目必须相同(列名、算术表达式、聚合函数等)。
· 在使用 UNION 组合的结果集中的相应列、或个别查询中使用的任意列的子集必须具有相同数据类型,并且两种数据类型之间必须存在可能的隐性数据转换,或提供了显式转换。例如,在 datetime 数据类型的列和 binary 数据类型的列之间不可能存在 UNION 运算符,除非提供了显式转换,而在 money 数据类型的列和 int 数据类型的列之间可以存在 UNION 运算符,因为它们可以进行隐性转换。
· 用 UNION 运算符组合的各语句中对应的结果集列出现的顺序必须相同,因为 UNION 运算符是按照各个查询给定的顺序逐个比较各列。
示例如下:
table3 table4
a b -c a b
int char(4) char(4) char(4) float
--- ------- ------- ------- -------
1 abc jkl jkl 1.000
2 def mno mno 5.000
3 ghi pqr

执行以下查询:
SELECT a, b FROM table3
UNION
SELECT b, a FROM table4
下面是结果集:
a b
-------- -----
1.000000 abc
2.000000 def
3.000000 ghi
1.000000 jkl
5.000000 mno
在 UNION 操作中组合不同的数据类型时,这些数据类型将使用数据类型优先级的规则进行转换。在前面的示例中,int 值转换成 float 值,因为 float 类型的优先权比 int 类型高。有关更多信息,请参见数据类型的优先顺序。
以下查询将产生错误信息,因为相应列的数据类型不兼容:
SELECT b, c FROM table3
UNION
SELECT a, b FROM table4
· 通过 UNION 生成的表中的列名来自 UNION 语句中的第一个单独的查询。若要用新名称引用结果集中的某列(例如在 ORDER BY 子句中),必须按第一个 SELECT 语句中的方式引用该列:
· SELECT city AS Cities FROM stores_west
· UNION
· SELECT city FROM stores_east
· ORDER BY city

回复
carlton 2003-02-25
Union all是sql-92中的标准语法。
以上只是一个举例的说法。
可以如下描述:如何使union all生成的数据集再利用。我已经搜索到几篇,但都通不过。
如把上句写全:
select dd,tt
from
(select dd,tt from 2002 union all
select dd,tt from 2003 )
as temp (dd,tt)
即使如此,还是通不过。
请各位赐教!
回复
xmvigour 2003-02-25
Select *
From
(select * from 2002)Union all(Select * from 2003)
-----------
或写成:
-------------
Select *
From
(select * from 2002)Union all(Select * from 2003) as temp (dd,tt)

-----------------------------------
其实你的结果只要即可 记得2002和2003地表结构要一样
select * from 2002
Union all
Select * from 2003

如果要排序
可以
select * from
(select * from 2002
Union all
Select * from 2003)
order by 1
回复
jcq 2003-02-25
你用的什么数据库呢
回复
jcq 2003-02-25
union all 这个是什么数据库的语法。
回复
相关推荐
发帖
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2003-02-25 04:30
社区公告
暂无公告