顶下先前的一个SQL超难语句,请教

时间:2021-01-12 21:55:08
先前一个兄弟说过这个语句,我就借用下他的,然后加入我比他多的一些需求

kc表
kcid  kctitle   kcis
1     沈阳       1
2     天津       0
3     北京       1
4     上海       1


kb表
kbid      jgid(jg表的主键)      kcid(kc表主键)      kbtitle            kbtime        hid
1         1                      1                沈阳计划会议      2009-2-10        9
2         1                      2                北京计划会议      2009-2-10        8
3         1                      1                沈阳计划会议      2009-3-10       14
4         1                      1                沈阳计划会议      2009-5-10       14
5         1                      1                沈阳计划会议      2009-6-10       14
6         2                      4                上海会客吃饭      2009-4-10        6

读出一组数据,这些数据满足下面条件

1 . jgid不一样

2 . 相同jgid的数据,只显示一条,并且这条数据中的 kbtime 是大于当前时间,并离当前时间最近的一条

3 . hid=9 or  hid=14

4 . kcis=1

按今天是2009-03-26算,大于当前时间,排除了前三条,然后根据 hid=9 or hid=14 ,那么第6条就不满足,只有第4条和第5条,但

相同jgid的只能显示一条,那么 4和5只能显示一条,而且kcis是1的,然后要求显示的是离当前时间最近的一条,最后得到的结果是 

bid 为 4的这条 

kbid      jgid(jg表的主键)      kcid(kc表主键)      kbtitle            kbtime        hid
4           1                    1                 沈阳计划会议       2009-5-10       14

最后显示的结果是


kbid    jgtitle  kctitle  kbtitle              kbtime        hid
4       开会    沈阳     沈阳计划会议        2009-5-10      14 

这个SQL语句该怎么写啊?拜托了

19 个解决方案

#1


昨天不是帮你写过了?

#2


你好象还少了一个表,把昨天的地址帖出来.

#3


Select c.*,b.*
from kb b,kc c
where not exists(select 1 from kb where jgid = b.jgid and kbtime < b.kbtime and kbtime > getdate() )
   and hid in (9,14) and kbtime > getdate() 
   and b.jgid = c.kcid

#4


先对kb表取出数据.

select t.* from kb t where kbtime > getdate() and kbtime = (select max(kbtime) from kb where kbtime > getdate() and jgid = t.jgid)


然后联合两外两表查询,你少个表,开会不在了.

#5


try:

select  
    b.*
from
    kb b,kc c
where
    b.kcid=c.kcid and c.kcis=1 and (b.hid=9 or b.hid=14) 
    and
    b.kbtime=(select
                  min(kbtime) 
              from 
                  kb 
              where 
                  jgid=b.jgid and kcid=b.kcid and (hid=9 or hid=14) and kbtime>getdate())

#6



declare @kc table(kcid int,kctitle varchar(10),kcis int)
insert into @kc select 1,'沈阳',1 
insert into @kc select 2,'天津',0 
insert into @kc select 3,'北京',1 
insert into @kc select 4,'上海',1 

declare @kb table(kbid int,jgid int,kcid int,kbtitle varchar(20),kbtime datetime,hid int)
insert into @kb select 1,1,1,'沈阳计划会议','2009-2-10', 9 
insert into @kb select 2,1,2,'北京计划会议','2009-2-10', 8 
insert into @kb select 3,1,1,'沈阳计划会议','2009-3-10',14 
insert into @kb select 4,1,1,'沈阳计划会议','2009-5-10',14 
insert into @kb select 5,1,1,'沈阳计划会议','2009-6-10',14 
insert into @kb select 6,2,4,'上海会客吃饭','2009-4-10', 6 

select  
    b.*
from
    @kb b,@kc c
where
    b.kcid=c.kcid and c.kcis=1 and (b.hid=9 or b.hid=14) 
    and
    b.kbtime=(select
                  min(kbtime) 
              from 
                  @kb 
              where 
                  jgid=b.jgid and kcid=b.kcid and (hid=9 or hid=14) and kbtime>getdate())

/*
kbid        jgid        kcid        kbtitle              kbtime                                                 hid         
----------- ----------- ----------- -------------------- ------------------------------------------------------ ----------- 
4           1           1           沈阳计划会议          2009-05-10 00:00:00.000                                14
*/

#7


不好意思,我读出了,还少了一个
jg表
jgid  jgtitle
1     开会      
2     吃饭     
3     休息 
...

我还要读出这里的  jgtitle

#8


引用 7 楼 jsksmark 的回复:
不好意思,我读出了,还少了一个 
jg表 
jgid  jgtitle 
1    开会      
2    吃饭    
3    休息 
... 

我还要读出这里的  jgtitle


create table kc(kcid int, kctitle varchar(10), kcis int)
insert into kc values(1 , '沈阳' , 1 )
insert into kc values(2 , '天津' , 0 )
insert into kc values(3 , '北京' , 1 )
insert into kc values(4 , '上海' , 1 )
create table kb(kbid int, jgid int, kcid int, kbtitle varchar(20), kbtime datetime, hid int)
insert into kb values(1 , 1 , 1 , '沈阳计划会议' , '2009-2-10' , 9 )
insert into kb values(2 , 1 , 2 , '北京计划会议' , '2009-2-10' , 8 )
insert into kb values(3 , 1 , 1 , '沈阳计划会议' , '2009-3-10' , 14 )
insert into kb values(4 , 1 , 1 , '沈阳计划会议' , '2009-5-10' , 14 )
insert into kb values(5 , 1 , 1 , '沈阳计划会议' , '2009-6-10' , 14 )
insert into kb values(6 , 2 , 4 , '上海会客吃饭' , '2009-4-10' , 6 )
create table jg(jgid int, jgtitle varchar(10))
insert into jg values(1 , '开会') 
insert into jg values(2 , '吃饭') 
insert into jg values(3 , '休息')
go

select t1.kbid,
       t2.jgtitle , 
       t3.kctitle , 
       t1.kbtitle ,             
       t1.kbtime  ,
       t1.hid 
from 
(
  select t.* from kb t where kbtime > getdate() and (hid=9 or hid=14) and kbtime = (select min(kbtime) from kb where kbtime > getdate() and (hid=9 or hid=14) and jgid = t.jgid)
) t1 , jg t2 , kc t3
where t1.jgid = t2.jgid and t1.kcid = t3.kcid and t3.kcis = 1


drop table kc , kb , jg 

/*
kbid        jgtitle    kctitle    kbtitle              kbtime                                                 hid         
----------- ---------- ---------- -------------------- ------------------------------------------------------ ----------- 
4           开会         沈阳         沈阳计划会议               2009-05-10 00:00:00.000                                14

(所影响的行数为 1 行)

*/

#9


这个SQL语句并不满足条件,比如,我在kb这个表中插入数据

insert into kb values(7 , 1 , 1 , '沈阳计划会议adafds' , '2009-5-10' , 14 )

可以看出,显示的结果是 两条了,他们的jgid是一样的

#10


他们同为5-10号,你用哪条?你的需求中没有说明.

#11


我想用的是多条相同的,我想用ID相对于比较小的那个就是kbid相对于小的那个

#12


引用 11 楼 jsksmark 的回复:
我想用的是多条相同的,我想用ID相对于比较小的那个就是kbid相对于小的那个


create table kc(kcid int, kctitle varchar(10), kcis int)
insert into kc values(1 , '沈阳' , 1 )
insert into kc values(2 , '天津' , 0 )
insert into kc values(3 , '北京' , 1 )
insert into kc values(4 , '上海' , 1 )
create table kb(kbid int, jgid int, kcid int, kbtitle varchar(20), kbtime datetime, hid int)
insert into kb values(1 , 1 , 1 , '沈阳计划会议' , '2009-2-10' , 9 )
insert into kb values(2 , 1 , 2 , '北京计划会议' , '2009-2-10' , 8 )
insert into kb values(3 , 1 , 1 , '沈阳计划会议' , '2009-3-10' , 14 )
insert into kb values(4 , 1 , 1 , '沈阳计划会议' , '2009-5-10' , 14 )
insert into kb values(5 , 1 , 1 , '沈阳计划会议' , '2009-6-10' , 14 )
insert into kb values(6 , 2 , 4 , '上海会客吃饭' , '2009-4-10' , 6 )
insert into kb values(7 , 1 , 1 , '沈阳计划会议adafds' , '2009-5-10' , 14 ) 
create table jg(jgid int, jgtitle varchar(10))
insert into jg values(1 , '开会') 
insert into jg values(2 , '吃饭') 
insert into jg values(3 , '休息')
go

select t1.kbid,
       t2.jgtitle , 
       t3.kctitle , 
       t1.kbtitle ,             
       t1.kbtime  ,
       t1.hid 
from 
(
  select t.* , px = (select count(1) from kb where kbtime > getdate() and (hid=9 or hid=14) and jgid = t.jgid and (kbtime < t.kbtime or (kbtime = t.kbtime and kbid < t.kbid))) + 1 from kb t where kbtime > getdate() and (hid=9 or hid=14)
) t1 , jg t2 , kc t3
where t1.jgid = t2.jgid and t1.kcid = t3.kcid and t3.kcis = 1 and t1.px = 1


drop table kc , kb , jg 

/*
kbid        jgtitle    kctitle    kbtitle              kbtime                                                 hid         
----------- ---------- ---------- -------------------- ------------------------------------------------------ ----------- 
4           开会         沈阳         沈阳计划会议               2009-05-10 00:00:00.000                                14

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

#13


楼上正解了。

#14


帮顶。

#15


不错不错,顶一个

#16


这个还没有结?

#17


上面的SQL语句,我移植到我先前已经做好的数据库中,貌似不对,居然读不出结果来

#18


学习,学习、
真不错

#19


学习来的

#1


昨天不是帮你写过了?

#2


你好象还少了一个表,把昨天的地址帖出来.

#3


Select c.*,b.*
from kb b,kc c
where not exists(select 1 from kb where jgid = b.jgid and kbtime < b.kbtime and kbtime > getdate() )
   and hid in (9,14) and kbtime > getdate() 
   and b.jgid = c.kcid

#4


先对kb表取出数据.

select t.* from kb t where kbtime > getdate() and kbtime = (select max(kbtime) from kb where kbtime > getdate() and jgid = t.jgid)


然后联合两外两表查询,你少个表,开会不在了.

#5


try:

select  
    b.*
from
    kb b,kc c
where
    b.kcid=c.kcid and c.kcis=1 and (b.hid=9 or b.hid=14) 
    and
    b.kbtime=(select
                  min(kbtime) 
              from 
                  kb 
              where 
                  jgid=b.jgid and kcid=b.kcid and (hid=9 or hid=14) and kbtime>getdate())

#6



declare @kc table(kcid int,kctitle varchar(10),kcis int)
insert into @kc select 1,'沈阳',1 
insert into @kc select 2,'天津',0 
insert into @kc select 3,'北京',1 
insert into @kc select 4,'上海',1 

declare @kb table(kbid int,jgid int,kcid int,kbtitle varchar(20),kbtime datetime,hid int)
insert into @kb select 1,1,1,'沈阳计划会议','2009-2-10', 9 
insert into @kb select 2,1,2,'北京计划会议','2009-2-10', 8 
insert into @kb select 3,1,1,'沈阳计划会议','2009-3-10',14 
insert into @kb select 4,1,1,'沈阳计划会议','2009-5-10',14 
insert into @kb select 5,1,1,'沈阳计划会议','2009-6-10',14 
insert into @kb select 6,2,4,'上海会客吃饭','2009-4-10', 6 

select  
    b.*
from
    @kb b,@kc c
where
    b.kcid=c.kcid and c.kcis=1 and (b.hid=9 or b.hid=14) 
    and
    b.kbtime=(select
                  min(kbtime) 
              from 
                  @kb 
              where 
                  jgid=b.jgid and kcid=b.kcid and (hid=9 or hid=14) and kbtime>getdate())

/*
kbid        jgid        kcid        kbtitle              kbtime                                                 hid         
----------- ----------- ----------- -------------------- ------------------------------------------------------ ----------- 
4           1           1           沈阳计划会议          2009-05-10 00:00:00.000                                14
*/

#7


不好意思,我读出了,还少了一个
jg表
jgid  jgtitle
1     开会      
2     吃饭     
3     休息 
...

我还要读出这里的  jgtitle

#8


引用 7 楼 jsksmark 的回复:
不好意思,我读出了,还少了一个 
jg表 
jgid  jgtitle 
1    开会      
2    吃饭    
3    休息 
... 

我还要读出这里的  jgtitle


create table kc(kcid int, kctitle varchar(10), kcis int)
insert into kc values(1 , '沈阳' , 1 )
insert into kc values(2 , '天津' , 0 )
insert into kc values(3 , '北京' , 1 )
insert into kc values(4 , '上海' , 1 )
create table kb(kbid int, jgid int, kcid int, kbtitle varchar(20), kbtime datetime, hid int)
insert into kb values(1 , 1 , 1 , '沈阳计划会议' , '2009-2-10' , 9 )
insert into kb values(2 , 1 , 2 , '北京计划会议' , '2009-2-10' , 8 )
insert into kb values(3 , 1 , 1 , '沈阳计划会议' , '2009-3-10' , 14 )
insert into kb values(4 , 1 , 1 , '沈阳计划会议' , '2009-5-10' , 14 )
insert into kb values(5 , 1 , 1 , '沈阳计划会议' , '2009-6-10' , 14 )
insert into kb values(6 , 2 , 4 , '上海会客吃饭' , '2009-4-10' , 6 )
create table jg(jgid int, jgtitle varchar(10))
insert into jg values(1 , '开会') 
insert into jg values(2 , '吃饭') 
insert into jg values(3 , '休息')
go

select t1.kbid,
       t2.jgtitle , 
       t3.kctitle , 
       t1.kbtitle ,             
       t1.kbtime  ,
       t1.hid 
from 
(
  select t.* from kb t where kbtime > getdate() and (hid=9 or hid=14) and kbtime = (select min(kbtime) from kb where kbtime > getdate() and (hid=9 or hid=14) and jgid = t.jgid)
) t1 , jg t2 , kc t3
where t1.jgid = t2.jgid and t1.kcid = t3.kcid and t3.kcis = 1


drop table kc , kb , jg 

/*
kbid        jgtitle    kctitle    kbtitle              kbtime                                                 hid         
----------- ---------- ---------- -------------------- ------------------------------------------------------ ----------- 
4           开会         沈阳         沈阳计划会议               2009-05-10 00:00:00.000                                14

(所影响的行数为 1 行)

*/

#9


这个SQL语句并不满足条件,比如,我在kb这个表中插入数据

insert into kb values(7 , 1 , 1 , '沈阳计划会议adafds' , '2009-5-10' , 14 )

可以看出,显示的结果是 两条了,他们的jgid是一样的

#10


他们同为5-10号,你用哪条?你的需求中没有说明.

#11


我想用的是多条相同的,我想用ID相对于比较小的那个就是kbid相对于小的那个

#12


引用 11 楼 jsksmark 的回复:
我想用的是多条相同的,我想用ID相对于比较小的那个就是kbid相对于小的那个


create table kc(kcid int, kctitle varchar(10), kcis int)
insert into kc values(1 , '沈阳' , 1 )
insert into kc values(2 , '天津' , 0 )
insert into kc values(3 , '北京' , 1 )
insert into kc values(4 , '上海' , 1 )
create table kb(kbid int, jgid int, kcid int, kbtitle varchar(20), kbtime datetime, hid int)
insert into kb values(1 , 1 , 1 , '沈阳计划会议' , '2009-2-10' , 9 )
insert into kb values(2 , 1 , 2 , '北京计划会议' , '2009-2-10' , 8 )
insert into kb values(3 , 1 , 1 , '沈阳计划会议' , '2009-3-10' , 14 )
insert into kb values(4 , 1 , 1 , '沈阳计划会议' , '2009-5-10' , 14 )
insert into kb values(5 , 1 , 1 , '沈阳计划会议' , '2009-6-10' , 14 )
insert into kb values(6 , 2 , 4 , '上海会客吃饭' , '2009-4-10' , 6 )
insert into kb values(7 , 1 , 1 , '沈阳计划会议adafds' , '2009-5-10' , 14 ) 
create table jg(jgid int, jgtitle varchar(10))
insert into jg values(1 , '开会') 
insert into jg values(2 , '吃饭') 
insert into jg values(3 , '休息')
go

select t1.kbid,
       t2.jgtitle , 
       t3.kctitle , 
       t1.kbtitle ,             
       t1.kbtime  ,
       t1.hid 
from 
(
  select t.* , px = (select count(1) from kb where kbtime > getdate() and (hid=9 or hid=14) and jgid = t.jgid and (kbtime < t.kbtime or (kbtime = t.kbtime and kbid < t.kbid))) + 1 from kb t where kbtime > getdate() and (hid=9 or hid=14)
) t1 , jg t2 , kc t3
where t1.jgid = t2.jgid and t1.kcid = t3.kcid and t3.kcis = 1 and t1.px = 1


drop table kc , kb , jg 

/*
kbid        jgtitle    kctitle    kbtitle              kbtime                                                 hid         
----------- ---------- ---------- -------------------- ------------------------------------------------------ ----------- 
4           开会         沈阳         沈阳计划会议               2009-05-10 00:00:00.000                                14

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

#13


楼上正解了。

#14


帮顶。

#15


不错不错,顶一个

#16


这个还没有结?

#17


上面的SQL语句,我移植到我先前已经做好的数据库中,貌似不对,居然读不出结果来

#18


学习,学习、
真不错

#19


学习来的

#20