求SQL语句,可能比较复杂(200分)

  • 主题发起人 主题发起人 叶不归
  • 开始时间 开始时间

叶不归

Unregistered / Unconfirmed
GUEST, unregistred user!
表A 表B
A1 A2 A3 B1 B2
1 1 A 1 1
2 1 B 1 0
3 0 C
说明:表B是表A的从表,B1 --> A1
现在要选出 A2=0 or (A1 in B1 And B2=1) 的记录,并挑几个字段组成新表
结果应该是
如下: A1 A2 A3 B2
1 1 A 1
3 0 C Null
说的清楚吗?哪位想一下这个SQL语句如何写(oracle的),在线等待。
 
select a.a1, a.a2, a.a3, b.b2
from a, b
where a.a1 in (
(select a.a1 from cai.a where a.a2=0)
union
(select b.b1 from cai.b where b.b2<>0))

and

b.b1 in (
(select a.a1 from cai.a where a.a2=0)
union
(select b.b1 from cai.b where b.b2<>0)
)
我用以上SQL语句形成了如下结果:
A1 A2 A3 B2
1 1 A 1
3 0 C 1
第二条记录字段B2应该是Null的,可惜变成了1,唉,请高手指教
 
select A.a1,a.a2,a.a3,b.b2 from a,b
where a.a2=0 and a.a1*=b.b1
union
select A.a1,a.a2,a.a3,b.b2 from a,b
where a.a1=b.b1 anb B2=1 and
not exist(select A.a1,a.a2,a.a3,b.b2 from a,b
where a.a2=0 and a.a1*=b.b1)
这是SQL Server的,但Oracle应该差不多吧
 
这是用FOXPRO测试出的SELECT语句,其中的字段都是字符型的,数据取的是上面的例子:

select aa.a1, aa.a2, aa.a3, bb.b2 from aa LEFT OUTER JOIN bb
ON Aa.a1 = Bb.b1 group by aa.a1, aa.a2, aa.a3, bb.b2 having aa.a2="0"
union select aa.a1, aa.a2, aa.a3, bb.b2
from aa,bb where aa.a1 in (select bb.b1 from bb) and bb.b2 ="1"
 
[blue]select a.a1,a.a2,a.a3,b.b2
from a left outer join b on a.a1 = b.b1
where (a.a2 = 0) or (b.b2 = 1)[/blue]
 
select A1,a2,a3,b1
from a,b
where a.a2=0 and a.a1=b.b1(+)
union
select a1,a2,a3,b1
from a,b
where a.a1=b.b1 and b.b2=1

 
SELECT a.a1,a.a2,a.a3,b.b1 FROM 表A a,表B b
WHERE (a.a2=0 OR (a.a1 IN (SELECT DISTINCT b1 FROM b WHERE B.b2=1)))
AND b.b1=a.a1(+)

修改一下:
------------------------------------------------------------
SELECT a.a1,a.a2,a.a3,b.b1 FROM 表A a,表B b
WHERE (a.a2=0 OR (a.a1 IN (SELECT DISTINCT b1 FROM b WHERE b2=1)))
AND b.b1=a.a1(+)
 
mk1024的方法比较简单,但要注意A表与B表的从属关系必须是完全的,否则可能会获得
不正确的结果。该问题的思路如下,排列出A表与B表进行左连接的笛卡儿乘积:

a1 a2 a3 b2
1 1 A 1
1 1 A 0
1 1 A NULL
2 1 B 1
2 1 B 0
2 1 B NULL
3 0 C 1
3 0 C 0
3 0 C NULL

然后从中筛选出想要的结果就是:(a.a2 = 0) or (b.b2 = 1)。而我开始的SELECT 语句是
分开测试的,所以比较复杂。

谢谢 mk1024 的方法。
 
谢谢大家的回答,我测了一下
desertsmoke: 返回结果(不正确)
A1 A2 A3 B2
1 1 A 1

tangzwei: 返回结果(无,是SQL Sever的,在Oracle里无法调试)
鲨鱼: 也不是Oracle的
mk1024: 也不是Oracle的
完颜康:返回结果(完全正确,谢谢!)
A1 A2 A3 B2
1 1 A 1
3 0 C
 
后退
顶部