求个简单高效的SQL语句

cqdj 2010-04-27 09:03:57
现在有两张表表A ,其中存放的是公式,表B中存放的是每个单位按照公式审核的情况,可能是审核通过,也可能已经审核过,但是没有通过(如0表示不通过,1表示通过),也可能表B中还没有任何公式的信息(还从来没有进行审核过),现在求个查询已经完全审核通过的单位的语句,谢谢了。
...全文
93 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
永生天地 2010-04-28
  • 打赏
  • 举报
回复
双重否定不会,这个单独否定还可以

select * from b b1 where not exists
(select 1 as aflag from a left join (select * from b where b.divcode=b1.divcode) b2 on a.fid=b2.fid
where isnull(b2.aflag ,0) = 0 )
dawugui 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cqdj 的回复:]
请老大给个双重否定的sql,谢谢!
[/Quote]
参考这个:
现有两张表 
create table C(C# int,CN varchar)
create table SC(S# int,C# int,G int)

表中数据如下
C表
C# CN
1 厚黑学
2 查询基础
3 能说
4 会道

http://topic.csdn.net/u/20080313/21/acb7f550-8ce7-4352-96dc-4715a0e43287.html?398509657

SC表
S# C# G
1 1 1
1 3 6
2 1 75
2 2 55
2 3 7
2 4 7
3 3 77
4 1 75
4 2 55
4 3 7
4 4 7
6 6 6
7 4 7

要求显示出SC表中的C#包含C表中所有的C#的行

即结果是
2 1 75
2 2 55
2 3 7
2 4 7
4 1 75
4 2 55
4 3 7
4 4 7

-----------------------------------------------
create table C(C# int, CN varchar(10))
insert into C values(1, '厚黑学')
insert into C values(2, '查询基础')
insert into C values(3, '能说')
insert into C values(4, '会道')
create table SC(S# int, C# int, G int)
insert into SC values(1 ,1 ,1 )
insert into SC values(1 ,3 ,6 )
insert into SC values(2 ,1 ,75)
insert into SC values(2 ,2 ,55)
insert into SC values(2 ,3 ,7 )
insert into SC values(2 ,4 ,7 )
insert into SC values(3 ,3 ,77)
insert into SC values(4 ,1 ,75)
insert into SC values(4 ,2 ,55)
insert into SC values(4 ,3 ,7 )
insert into SC values(4 ,4 ,7 )
insert into SC values(6 ,6 ,6 )
insert into SC values(7 ,4 ,7 )
go

select * from sc aa where not exists
(select 1 from c a left join (select * from sc where s#=aa.s#) b on a.c#=b.c#
where b.c# is null)

/*
S# C# G
----------- ----------- -----------
2 1 75
2 2 55
2 3 7
2 4 7
4 1 75
4 2 55
4 3 7
4 4 7

(所影响的行数为 8 行)
*/

--------------------------------------------------------------
--1、取出所有的S#
select distinct S# from SC
/*
S#
-----------
1
2
3
4
6
7
(所影响的行数为 6 行)
*/

--2、取出所有的S#,C#
select M.* , C.C# from (select distinct S# from SC) M,C
/*
S# C#
----------- -----------
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
4 1
4 2
4 3
4 4
6 1
6 2
6 3
6 4
7 1
7 2
7 3
7 4
(所影响的行数为 24 行)
*/

--3、按上表找出在sc表不存在的S#,C#,然后只对S#取唯一即可。C#没用了。
select distinct t.S# from (select M.* , C.C# from (select distinct S# from SC) M,C) t where not exists (select 1 from SC n where n.S# = t.S# and n.C# = t.C#)
/*
S#
-----------
1
3
6
7
(所影响的行数为 4 行)
*/

--4、从sc表里的S#找出不在上表S#就是你要的结果
select sc.* from sc where S# not in (select distinct t.S# from (select M.* , C.C# from (select distinct S# from SC) M,C) t where not exists (select 1 from SC n where n.S# = t.S# and n.C# = t.C#))

drop table C,SC


cqdj 2010-04-27
  • 打赏
  • 举报
回复
就是嘛,感觉SQL还是比较复杂的,简单的写很多人都会,但是要写出简单高效的,还是需要功夫的,请老大们指点一下。
huozhiqiang66 2010-04-27
  • 打赏
  • 举报
回复
有什么好的方法,可以学好数据库
cqdj 2010-04-27
  • 打赏
  • 举报
回复
请老大给个双重否定的sql,谢谢!
dawugui 2010-04-27
  • 打赏
  • 举报
回复
如果你的数据不存在重复性,则如下,否则需要使用双重否定.
create table a(fid varchar(10), fname varchar(10))
insert into a values('001', '公式A')
insert into a values('002', '公式B')
create table b(divcode varchar(10),fname varchar(10),fid varchar(10), aflag int)
insert into b values('0001' , '单位A' , '001' , 1)
insert into b values('0001' , '单位A' , '002' , 1)
insert into b values('0002' , '单位B' , '001' , 1)
insert into b values('0002' , '单位B' , '002' , 0)
insert into b values('0003' , '单位C' , '002' , 1)
go

select fname from b where aflag = 1 group by fname having count(1) = (select count(1) from a)

drop table a , b

/*
fname
----------
单位A

(所影响的行数为 1 行)
*/
cqdj 2010-04-27
  • 打赏
  • 举报
回复
create table a as (select '001' as fid,'公式A' fname union select '002' as fid,'公式B' fname );

create table b as (select '0001' as divcode,'单位A' fname,'001' as fid,'1' as aflag
union all
select '0001' as divcode,'单位A' fname,'002' as fid,'1' as aflag
union all
select '0002' as divcode,'单位B' fname,'001' as fid,'1' as aflag
union all
select '0002' as divcode,'单位B' fname,'002' as fid,'0' as aflag
union all
select '0003' as divcode,'单位C' fname,'002' as fid,'1' as aflag
);
现在我想要的结果是:单位A,由于两个公式都在B表存在,而且审核标志都是1(通过)的,因此单位A算通过,单位B,虽然两个公式都在,但是有一个是0(没有通过),因此,结果中不包含,单位C由于只有一个公式在(还缺少一个),因此也不算,需要在一个SQL中实现。谢谢!
--小F-- 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 cqdj 的回复:]
现在有两张表表A ,其中存放的是公式,表B中存放的是每个单位按照公式审核的情况,可能是审核通过,也可能已经审核过,但是没有通过(如0表示不通过,1表示通过),也可能表B中还没有任何公式的信息(还从来没有进行审核过),现在求个查询已经完全审核通过的单位的语句,谢谢了。
[/Quote]

最好给测试数据和表结构
dawugui 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 cqdj 的回复:]
现在有两张表表A ,其中存放的是公式,表B中存放的是每个单位按照公式审核的情况,可能是审核通过,也可能已经审核过,但是没有通过(如0表示不通过,1表示通过),也可能表B中还没有任何公式的信息(还从来没有进行审核过),现在求个查询已经完全审核通过的单位的语句,谢谢了。
[/Quote]

select a.* , b.* from a , b where a.关键字 = b.关键字 and b.审核字段 = 1
dawugui 2010-04-27
  • 打赏
  • 举报
回复
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
黄_瓜 2010-04-27
  • 打赏
  • 举报
回复
看的不是很明白,给点数据吧,呵呵

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧