当前位置:主页>销售管理软件> 列表

请问一个数据库查询问题 找速达3000软件

财务软件版1楼: 比如有两个表:
表A:
班号 学号
1 1
1 2
2 3
2 4

表B
组号 学号
1 1
1 2
1 3
2 4
2 5

如何通过SQL查询知道 编号为1的班 完整的属于 编号为1的组(也就是1班中的所有学生都在1组中,而1组中可以有比1班更多的学生)?

谢谢!

2楼: select * from A,B where A.bh=1 and B.zh<>1 and a.xh = b.xh
如果有记录则不符合 如记账软件

3楼: 可能我没说清楚,我想将所有 班 和 组 之间的包含关系列出来,该怎么做?
比如
组 班
1 1
1 3
...

4楼: 我是想建一个视图,方便以后的查询。比方给定一个组,我能查到他所包含的所有完整的班,或者给定一个班,可以查到它所属的组。

5楼: 可查询出班组关系
select distinct a.bh,b.zh from a,b where a.xh = b.xh
班完整的属于组
select max(aa.zh) zh,aa.bh from (select distinct a.bh,b.zh from a,b where a.xh = b.xh) aa
group by a.bh having count(*) = 1


没调试,应该能完成

6楼: 应该不行,max(aa.zh)起什么作用?

财务软件版7楼: select b.组,a.班,count(distinct a.班)
from a inner join b
on a.号=b.号
group by b.组,a.班
having count(distinct a.班) =1

try it...

8楼: 表达不清

9楼: SELECT DISTINCT a.zh, b.bh
FROM a CROSS JOIN b
WHERE ((SELECT COUNT(a1.xh) FROM a a1, b a1 WHERE a1.xh = b1.xh AND b1.bh = b.bh AND a1.zh = a.zh) =
(SELECT COUNT(b2.xh) FROM b b2 WHERE a.bh = b2.bh))
这样行,已经验证,但是效率很差。有更好的办法么?

10楼: 举个例子:
班表
班号 学号
1 1
1 2
1 3
2 2
2 3
2 4
3 5
3 6
4 7


组表
组号 学号
1 1
1 2
1 3
1 4
1 5
2 1
2 3
2 5
2 7

要的结果是
组号 班号
1 1
1 2
2 4

道长的方法不行

11楼: in

12楼: SELECT 班号,组号 FROM
(SELECT DISTINCT A.班号,B.组号
FROM 表A A LEFT JOIN 表B B ON A.学号=B.学号
GROUP BY A.班号,B.组号) T
WHERE NOT EXISTS(SELECT 1 FROM T AS TT WHERE TT.班号=T.班号 AND TT.组号<>T.组号) 如erp软件是什么

13楼: 楼主,你试的怎么样了?我的语句可以吗?

财务软件版14楼:

15楼: SELECT 班号,组号 FROM
(SELECT DISTINCT A.班号,B.组号
FROM 表A A LEFT JOIN 表B B ON A.学号=B.学号
GROUP BY A.班号,B.组号) T
WHERE NOT EXISTS(SELECT 1 FROM T AS TT WHERE TT.班号=T.班号 AND TT.组号<>T.组号)
^
对象名 ''T'' 无效。

16楼: 如果把T用
(SELECT DISTINCT A.班号,B.组号
FROM 表A A LEFT JOIN 表B B ON A.学号=B.学号
GROUP BY A.班号,B.组号)
代替,则结果为
班号 组号
3 NULL
4 2

17楼: select tblgroup.grpid, tblclass.classid from tblgroup where (tblclass.stdid exist in (select tblgroup.stdid from tblgroup) group by tblgroup.grpidl, tblclass.classid

18楼: siva,你的查询有错

19楼: 樓主問題還沒解決阿?把你建表的sql貼上來,我們搞幾個數據試一下.

20楼: CREATE TABLE a (


bh int NOT NULL,
xh int NOT NULL
)

CREATE TABLE b(
zh int NOT NULL,
xh int NOT NULL
)
测试数据可以用我前面写的。 谢谢!

财务软件版21楼: 已经过测试,完全能达到你的要求的:
select * from
(select a.zh,d.bh from (select distinct zh from 组表) a
left join (select b.bh,c.zh from 班表 b left join 组表 c on b.xh=c.xh) d on d.zh=a.zh ) as e
group by e.zh,e.bh
1.先筛选出组号,
2.通过学号把组号和班号关联,
3.把组号和班号关联,
4.通过分组过滤掉同组班号相同的项

22楼: w009, 结果不对。拿我前面的那个例子试一下就知道了。 如速达3000软件

23楼: select distinct bb.zh, aa.bh from a aa,b bb where not exists(
select * from a aaa where aaa.bh=aa.bh and not exists(
select * from b where xh=aaa.xh and zh =bb.zh))

关系除法都可以转化为not exists来做

24楼: 沉香屑, 你是对的,不过好像效率不高。

25楼: 这要看哪个地方效率低了,如果是bb,aa没有连接条件,做笛卡尔积慢,就加连接条件
select distinct bb.zh, aa.bh from a aa,b bb where bb.xh=aa.xh and
not exists(
select * from a aaa where aaa.bh=aa.bh and not exists(
select * from b where xh=aaa.xh and zh =bb.zh))

如果索引比全表扫描快,就在zh、bh、xh上都加索引

如果是distinct引起排序慢,就用not exists替换distinct
select bb.zh, aa.bh from a aa,b bb where bb.xh=aa.xh and not exists
(select * from a a1,b b1 where a1.xh=b1.xh and b1.zh=bb.zh and a1.bh=aa.bh and a1.xhand not exists(
select * from a aaa where aaa.bh=aa.bh and not exists(
select * from b where xh=aaa.xh and zh =bb.zh))