求一查询SQL语句,涉及三个表的查询

shelliu 2008-12-27 01:22:09
有三个表:P(ID)、OBJOF(关系表,ITEMID1记录P.ID,ITEMID2记录P_DT.ID)、P_DT(ID、STATE、CTIME)

查询条件为:根据给定的STATE值,查询P_DT的STATE字段等于该值,并且在与同一个P相关的P_DT中,该P_DT的CTIME最大,根据该P_DT来查询与之相关的P。

即符合条件的记录应该是这样的:
符合条件的记录为P,则与P关联的所有P_DT中,CTIME最大的P_DT的STATE值为给定的值,请问这个能否用一个SQL语句写出来,谢谢!
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shelliu 2008-12-28
  • 打赏
  • 举报
回复
还不是我的意思

再简化一下好了
假设一个表:A,包含字段有NO,STATE和CTIME
现在需要找出表A中,不同的NO下CTIME最大,并且STATE的值为指定值的所有记录,例如:
A表中的记录为:
NO STATE CTIME
A1 A 2008-12-1
A1 指定值 2008-12-15
A1 C 2008-12-18
A2 B 2008-12-14
A2 A 2008-12-18
A2 指定值 2008-12-31
A3 指定值 2008-12-15
A4 C 2008-12-16
A4 D 2008-12-17
A5 A 2008-12-15
A5 指定值 2008-12-19

则选择出来的记录应该为
NO STATE CTIME
A2 指定值 2008-12-31
A3 指定值 2008-12-15
A5 指定值 2008-12-19
tmd456 2008-12-28
  • 打赏
  • 举报
回复
请搞楚一点
百年树人 2008-12-28
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[A]') is not null drop table [A]
go
create table [A]([NO] varchar(2),[STATE] varchar(6),[CTIME] datetime)
insert [A]
select 'A1','A','2008-12-1' union all
select 'A1','指定值','2008-12-15' union all
select 'A1','C','2008-12-18' union all
select 'A2','B','2008-12-14' union all
select 'A2','A','2008-12-18' union all
select 'A2','指定值','2008-12-31' union all
select 'A3','指定值','2008-12-15' union all
select 'A4','C','2008-12-16' union all
select 'A4','D','2008-12-17' union all
select 'A5','A','2008-12-15' union all
select 'A5','指定值','2008-12-19'

---查询---
select *
from A t
where not exists(select * from A where [NO]=t.[NO] and CTIME>t.CTIME)
and [STATE]='指定值'

---结果---
NO STATE CTIME
---- ------ -----------------------
A2 指定值 2008-12-31 00:00:00.000
A3 指定值 2008-12-15 00:00:00.000
A5 指定值 2008-12-19 00:00:00.000

(3 行受影响)

这样?
nalnait 2008-12-27
  • 打赏
  • 举报
回复

--TRY:

DECLARE @p table(id varchar(50))
insert into @p
select 'P1' UNION ALL
SELECT 'P2' UNION ALL
SELECT 'P3'

DECLARE @OBJOF TABLE(ITEMID1 VARCHAR(10),ITEMID2 VARCHAR(10))
INSERT INTO @OBJOF
SELECT 'P1','PD1' UNION ALL
SELECT 'P1','PD2' UNION ALL
SELECT 'P2','PD3' UNION ALL
SELECT 'P2','PD4' UNION ALL
SELECT 'P3','PD5'

DECLARE @P_DT TABLE (ID VARCHAR(40),STATE VARCHAR(30),CTIME DATETIME)
INSERT INTO @P_DT
SELECT 'PD1','A','2008-12-11' UNION ALL
SELECT 'PD2','给定值','2008-12-23' UNION ALL
SELECT 'PD3','B','2008-12-15' UNION ALL
SELECT 'PD4','C','2008-12-16' UNION ALL
SELECT 'PD5','给定值','2008-12-18'



SELECT A.ID,MAX(C.CTIME)CTIME FROM
@P A INNER JOIN @OBJOF B ON A.ID=B.ITEMID1 INNER JOIN @P_DT C ON B.ITEMID2=C.ID WHERE C.STATE='给定值'
GROUP BY A.ID



shelliu 2008-12-27
  • 打赏
  • 举报
回复
谢谢楼上的回复,是这样的,假设记录如下:
P中
P1(ID=P1)
P2(ID=P2)
P3(ID=P3)
OBJOF中
O1(ITEMID1=P1,ITEMID2=PD1)
O2(ITEMID1=P1,ITEMID2=PD2)
O3(ITEMID1=P2,ITEMID2=PD3)
O4(ITEMID1=P2,ITEMID2=PD4)
O5(ITEMID1=P3,ITEMID2=PD5)
P_DT中
PD1(ID=PD1,STATE='A',CTIME='2008-12-11')
PD2(ID=PD2,STATE='给定值',CTIME='2008-12-23')
PD3(ID=PD3,STATE='B',CTIME='2008-12-15')
PD4(ID=PD4,STATE='C',CTIME='2008-12-16')
PD5(ID=PD5,STATE='给定值',CTIME='2008-12-18')
则应该选择出来的记录应该是P1和P3
因为ITEMID1=P1的记录有两条,对应两个P_DT(PD1和PD2),并且PD2的CTIME最大,且STATE='给定值'
ITEMID1=P3的记录只有一条,对应一个P_DT(PD5),所以PD5的CTIME也是最大,且这里PD5的STATE也是等于'给定值'
P2不能被选出,因为ITEMID1=P2的记录有两条,对应两个P_DT(PD3和PD4),这里PD4的CTIME最大,但是它的STATE='C',不等于'给定值',所以不应被选出
不知道这样表达的是否明白,呵呵
nalnait 2008-12-27
  • 打赏
  • 举报
回复
不是很明白,最好给数据及要结果


select * from p inner join objof on p.id=objof.id where objof.id2=(select id from (select
id,max(ctime)ctime from p_dt where state='给定值' group by id)b)
claro 2008-12-27
  • 打赏
  • 举报
回复
帮顶

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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