如何编写能完成下列操作的 SQL 语句?(100分)

  • 主题发起人 主题发起人 question
  • 开始时间 开始时间
Q

question

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库环境 MS SQL 2000 工具 Delphi 5 操作系统 WIN2k
数据库中有三个表,表结构如下。
1)ACPP1999 表 : UserID is Key
UserID varchar (9), Name varchar (10) .. 等其他数据
2)BSEE2000 表 中的结构和 ACPP1999 表 完全一样,
3)MainTable 表:UserID+yearD is key
UserID varchar (9) , YearD varchar (4) ...
现在的 SQL 语句需要在 MainTable 表中 YearD 字段等于 1999 的时候到
ACPP1999 表中查询 UserID 和 MainTable 中UserID相等的记录并关联显示,YearD
等与2000的时候到 BSEE2000 表中关联,这样的 SQL 语句如何实现?要求不能使用
本地表。
急急急急急急!
 
用子查询。你自己在SQL server联机丛书中搜索关键词: 子查询 即可

子查询基础知识
子查询是一个 SELECT 查询,它返回单个值且嵌套在 SELECT、INSERT、UPDATE、
DELETE 语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。

下面的示例显示返回相同结果集的 SELECT 子查询和SELECT 联接:

/* SELECT statement built using a subquery. */
SELECT ProductName
FROM Northwind.dbo.Products
WHERE UnitPrice =
(SELECT UnitPrice
FROM Northwind.dbo.Products
WHERE ProductName = 'Sir Rodney''s Scones')

/* SELECT statement built using a join that returns
the same result set. */
SELECT Prd1.ProductName
FROM Northwind.dbo.Products AS Prd1
JOIN Northwind.dbo.Products AS Prd2
ON (Prd1.UnitPrice = Prd2.UnitPrice)
WHERE Prd2.ProductName = 'Sir Rodney''s Scones'


 
子查询应该解决不了这个问题,我试验过。
 
select a,b,c,case (a,b,c)此处为控制语句 from 表名 where 条件
你用select语句嵌套控制语句可以。
 
试试我的:
declare @bm char(8)
declare @nm char(4)
declare @hh char(9)
select @nm=YearD,@hh=userid from MainTable where 某某条件
if @nm=1999
select @bm=ACPP1999
if @nm=2000
select @bm=BSEE2000
exec ('select * from '+@bm+' where userid= '+@hh)
当然这是后台语句,前台你就用查询组件同理实现
 
不知你的SQL用在何处???
你可以先动态生成SQL 再执行嘛那样的话,任何可变情况不就小菜一碟了吗?
 
同意xiaoywh,用动态很简单,满足条件1时
query1.close;
query1.sql.clear;
query1.sql.add('select 1................')
满足条件2时
query1.close;
query1.sql.clear;
query1.sql.add('select 2................')

 
select a.* from ACPP1999 a,maintable b
where a.userid= b.userid
and b.yearD= '1999'
union
select c.* from BSEE2000 c,maintable b
where c.userid= b.userid
and b.yearD= '2000'

因为a表和c表的表结构一致,可以进行union.


 
To :li_yan5616
你的方法可以,但如果两个表的结构不完全一样,是否可行?
 
两个表的结构不完全一样,你就只有一个字段一个字段的写出来,而不能用*代替了。
 
多人接受答案了。
 

Similar threads

后退
顶部