200分求购这样的SQL语句(200分)

  • 主题发起人 主题发起人 app2001
  • 开始时间 开始时间
A

app2001

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个表A 和 B
A的结构是这样的:(D B C)
范例数据:
D B C
D1 T 5
D2 G 10
B的结构是这样的:(D B F)
范例数据:
D B F
D1 T 100
D3 G 100
要求用SQL语句得到以下数据集:
D B C F
D1 T 5 100
D2 G 10 0(NULL)
D3 G 0(NULL) 100
我觉得应该能得到,该怎么做呢?各位老兄多多帮忙。
 
如果是SQL Server,可以使用全连接。
具体,看全连接的帮助
 
我试一下
select a.d,a.b,a.c,b.f
from a full join b on a.d=b.d and a.b=b.b
上面不行
select a.d,a.b,a.c,b.f
from (select a.d,a.b from a union select b.d,b.b from b) c
full join a on a.d=c.d and a.b=c.b
full join b on c.d=b.d and c.b=b.b
不行
 
我试了一下
SELECT CASE a.a WHEN NULL THEN b.a ELSE a.a END a, CASE a.b WHEN NULL
THEN b.b ELSE a.b END b, a.c, b. d
FROM TABLE1 a FULL OUTER JOIN
table2 b ON a.a = b.a AND a.b = b.b

也不行
 
select distinct c.ff1, c.ff2, a.C, b.F from
(select a.D as ff1, a.B as ff2 from a union select b.D as ff1, b.B as ff2 from b) c
left join a on a.D = c.ff1 and a.B = c.ff2
left join b on b.D = c.ff1 and b.B = c.ff2
 
拼凑出来了
select c.d,c.b,max(c.c),max(b.f)
from (select a.d,a.b,a.c from ta a union select b.d,b.b,null from tb b)c left join tb b
on c.d=b.d and c.b=b.b
group by c.d,c.b
 
再不行就用存储过程啦
 
[8D]
很简单,我先去调试一下,然后再补上,到时别不给分哟!
 
当然,当然,言出必行,我是个讲话算数的男人
 
[8D]
给分吧[red](我又改了一下,加了显示字段名)[/red]:
SELECT A.D, A.B, isnull(A.C,0) as C, isnull(B.F,0) as F
FROM A LEFT OUTER JOIN
B ON A.D = B.D AND A.B = B.B
union
SELECT D, B, 0 AS C, isnull(F,0) as F FROM B WHERE D + '@@@' + B NOT IN (SELECT D + '@@@' + B FROM A)
不一定是最优的,但是成功的。

显示结果:
D B C F
-----------------------------
D1 T 5 100
D2 G 10 0
D3 T 0 100

(所影响的行数为 3 行)

 
致:pyzf1兄
你说的对,真的得,我不会食言的,但请你解释一下
SELECT D, B, 0 AS C, isnull(F,0) as F FROM B WHERE D + '@@@' + B NOT IN (SELECT D + '@@@' + B FROM A)
里的 D + '@@@' + B NOT IN (SELECT D + '@@@' + B FROM A是什么意思?
另外这样的语句能在SYBASE里支持吗?
真的谢谢你
 
我写的SQL如下:
SELECT D.*,ISNULL(A.B,B.B),ISNULL(A.C,0),ISNULL(B.F,0)
FROM (SELECT A.D
FROM A
UNION
SELECT B.D
FROM B) AS D LEFT OUTER JOIN A ON D.D=A.D LEFT OUTER JOIN B ON D.D=B.D

结果如下:
D1 T 5 100
D2 G 10 0
D3 [red]G [/red] 0 100
不知是否合适,如合适,请给分了!哈哈!




 
用的什么数据库呀
 
select distinct c.ff1, c.ff2, isnull(a.C,0) ,isnull( b.F,0)
from
(select a.D ff1, a.B ff2 from a
union
select b.D ff1, b.B ff2 from b) c
left join a on a.D = c.ff1 and a.B = c.ff2
left join b on b.D = c.ff1 and b.B = c.ff2
 
>> D + '@@@' + B NOT IN (SELECT D + '@@@' + B FROM A
这句话主要找出B表有但A表中没有的记录。
在查找时是以字段“D”和“B”作条件的,如果两个同时查找的话,有点麻烦,所以就直接
合起来。但为了预防这种情况:“ABC”+“DEF”=“ABCDEF”;“ABCD”+“EF”=“ABCDEF”
所以就在中间加上“@@@”来预防。
这种解决办法还不是万无一失,仔细想一下,可能还会有意外,但出现的机率是很小的。
好的办法可以重新想一下,或者预防在记录中出现“@@@”的字样,就肯定没问题了。

再说的话,如果你的表结构设计再好一点的话,就不用这么辛苦构造这条语句了。不过这是
题外话。
 
luojf999 的方法比较好,更容易理解(我再想一想,肯定也是这种方法,不过人家写出来了
,我就不再逞强了),不过我是第一个解决的啊,看你怎么给分了。

哇塞,sdhxdjw的方法也可以,也比我的方法简单,没办法,这家伙青出于蓝胜于蓝了!
——艺无止尽啊![:)][:)]

两个人的思路是一样的,不过luojf999用了替代法,所以更好做好看一点,也亏sdhxdjw费心思
写出来!
 
多谢各位,真帮了我大忙了,我试了一下各位的语句,只有luojf999和pyzfl的答案是符合
我要求答案的所以我将分数平分给两位了,也谢谢各位了,天气不错,因为你们的帮忙,我
的心情也不错了,也祝你们一样,谢谢
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部