一个简单的SQL语句问题(200分)

  • 主题发起人 主题发起人 Town
  • 开始时间 开始时间
T

Town

Unregistered / Unconfirmed
GUEST, unregistred user!
我有两个动态生成的临时表:

表A有4条记录,示例如下:
ID Name ValueA
1 a 10
2 b 15
3 c 12
4 d 13

表B有6条记录,示例如下:
ID Name ValueB
1 b 13
2 a 11
3 c 18
4 d 11
5 f 22
6 e 21

我想把两个表结合起来,生成这样一个表:

ID Name ValueB ValueA TotalAB
1 a 11 10 21
2 b 13 15 18
3 c 18 12 30
4 d 11 13 24
5 e 21 0 21
6 f 22 0 22

如果用 A.Name=B.Name匹配, 只能出现4条记录,表B中Name=e和Name=f的记录是
不会出现的。 请问怎样写这个SQL? 谢谢啦~~
 
老兄,对此问题 可以用case 语句 实现,你要不试试看!!!!!
 
呵呵,实在不好意思,我只懂的简单一些的SQL语句,Case还没用过,如果您有空
是否可以帮我写一个? 或者, 请问哪儿有SQL语句参考之类的书可用?
 
select a.value1,b.valueb,a.valuea+b.valueb valueab
from a,b
group by b.name

我是胡乱写的,不要骂我!
 
呵呵,这是不对的。
 
select b.id,b.name,b.valueb,a.valuea,b.valueb+a.valuea
from b left join a
on b.name=a.name
 
select b.id,b.name,b.valueb,a.valuea,(b.valueb+a.valuea) as totalAB from a,b
where b.id=a.id and b.name=a.name
order by b.name
 
有些数据库不支持 case 的用法,还是 ugvanxk 的好啊
select b.id,b.name,b.valueb,a.valuea,isnull(b.valueb,0)+isnull(a.valuea,0)
from b left join a
on b.name=a.name
 
将以下语句粘贴过去,看看结果是否你想要的:
select
bbb.name,
case when valuea is NULL then 0
else valuea
end as valuea,
valueb,
case
when valuea+valueb is null then valueb
else valuea+valueb
end as totalab
from aaa full outer join bbb on aaa.name=bbb.name

具体的变化你在根据你的需要更改吧,形式就是这样子
 
To Town:
select b.id,b.name,isnull(b.valueb,'0'),isnull(a.valuea,'0'),
isnull(a.valuea,'0')+isnull(b.valueb,'0')
from a,b
where b.name *=a.name
order by b.name

另外:ugvanxk 的写法也是对的。
Dolly.
 
我觉得用union来做比较简单易懂
 
To Town:
select b.id,b.name,isnull(b.valueb,0),isnull(a.valuea,0),
isnull(a.valuea,0)+isnull(b.valueb,0)
from a,b
where b.name *=a.name
order by b.name

另外:ugvanxk 的写法也是对的。
Dolly.
 
在早期的 Microsoft® SQL Server™ 2000 版本中,使用 *= 和 =* 在 WHERE 子句中指定
左、右外部联接条件。有时,该语法会导致有多种解释的不明确查询。FROM 子句中指定
遵从 SQL-92 的外部联接,不会导致上述不确定性。因为 SQL-92 语法更为精确。
以后的 SQL Server 版本可能不再支持该语法。任何使用 Transact-SQL 外部联接的语句
都应改为使用 SQL-92 语法。

SQL-92 标准支持 FROM 或 WHERE 子句中的内部联接规范。WHERE 子句中指定的内部联接
不会出现与 Transact-SQL 外部联接语法相同的不确定性问题。

 
ugvanxk的结果接近。但是有一个问题, 就是用Left join
后,计算Total的值不正确, 因为结合完毕的表为:
ID Name ValueB ValueA TotalAB
1 a 11 10 21
2 b 13 15 18
3 c 18 12 30
4 d 11 13 24
5 e 21 ? ?
6 f 22 ? ?

E和F在ValueA上是“空”,而不是 0, 所以无法计算结果 :(


 
select b.a1,b.a2,b.a3,nvl(a.a3,'0'),nvl(a.a3+b.a3,b.a3)
from test001 a,test002 b where a.a1(+)=b.a1
********************************************************************
SQL> select * from test001;

A1 A2 A3
---------- -------------------- ----------
1 a 10
2 b 15
3 c 12
4 d 13
SQL> select * from test002;

A1 A2 A3
---------- -------------------- ----------
1 a 10
2 b 15
3 c 12
4 d 13
5 e 10
6 f 15
7 g 12
8 h 13
SQL> select b.a1,b.a2,b.a3,nvl(a.a3,'0'),nvl(a.a3+b.a3,b.a3)
2 from test001 a,test002 b where a.a1(+)=b.a1;

A1 A2 A3 NVL(A.A3,'0') NVL(A.A3+B.A3,B.A3)
---------- -------------------- ---------- ------------- -------------------
1 a 10 10 20
2 b 15 15 30
3 c 12 12 24
4 d 13 13 26
5 e 10 0 10
6 f 15 0 15
7 g 12 0 12
8 h 13 0 13
***********************************************************************
这是在Oracle8.1.7下的结果,不知道是否满足你的要求。
 
我是在ADO+Access下用的, 好像不支持Case,nvl等东东。

isnull(b.valueb,0)说参数个数不对。 总之, 还没试验成功。

到现在为止,最接近最后答案的是ugvanxk, 只要解决0和null的问题就ok了。
 
select BBB.id,BBB.name,BBB.valueb,AAA.valuea,BBB.valueb+AAA.valuea as totalab
from (select name,valuea from a
union
select name,0 as valuea from b
where name not in (select name from a)) AAA,b BBB
where AAA.name=BBB.name
 
isnull的参数只有一个,返回值为true或false,表示参数是否为空。它在sql语句中不能使用的。

是不是可以在引用前对各个域进行判断,然后处理呢?
如:
if ( isNull(query1.fieldByName('valueA').value) ) then
iValueA := 0;
iValueAB := query1.fieldByName('valueB').asInteger;
end;

 
select b.id,b.name,isnull(b.valueB,0),isnull(a.valueA,0),b.valueB+isnull(a.valueA,0) from B b left join A a on b.id=a.id
问题解决了!!!
 
兄弟, 我的是ACCESS+ADO, 不支持isnull(x,x)的函数形式,只支持isnull(X),但是
返回的是true或者false :(
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
A
回复
0
查看
573
Andreas Hausladen
A
D
回复
0
查看
862
DelphiTeacher的专栏
D
后退
顶部