%%%%%一个查询问题%%%%%

nik_Amis 2008-05-18 11:24:42
主表A
ID,SupplierID,M,
1,2,1,
2,2,11
3,1,2
子表B
ID,SupplierName
1,IBM
2,MS
子表C
ID,AID,V,FDate
1,1,32,08-03-02
2,1,24,08-03-01
3,1,13,08-01-02
4,2,34,08-03-02

要求查询结果为
1,2,1,IBM,32,08-03-02
2,2,11,MS,34,08-01-02
3,1,2,null,null,null,null

就是B的ID与A的SupplierID关联,C的AID与A的ID关联,查询的时候只要C里面日期最新的记录的值
请各位高手帮帮忙看看咋写?
...全文
250 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
pt1314917 2008-06-07
  • 打赏
  • 举报
回复

create table A (AID int,BID int,M varchar(10))
insert into A
select 1,2,'X' union all
select 2,2,'S' union all
select 3,1,'P'

create table B (BID int,SupplierName varchar(3))
insert into B
select 1,'IBM' union all
select 2,'MS'

create table C (CID int,AID int,Memo varchar(10),FDate datetime,M varchar(10))
insert into C
select 1,1,'OK','08-03-02','X' union all
select 2,1,'NO','08-03-01','X' union all
select 3,1,'Cancel','08-01-02','X' union all
select 4,2,'Bad','08-03-02','S'

select a.*,b.SupplierName,c.Memo,c.Fdate from a left join b on a.aid=b.bid
left join (select * from c t where not exists(select 1 from c where aid=t.aid and fdate>t.fdate))c
on a.aid=c.aid and a.m=c.m

nik_Amis 2008-06-07
  • 打赏
  • 举报
回复
x
nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
gaoshoune?
nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
A,C;A,B为1:n的关系
取的时候只取A中的所有纪录,并通过关联取得B.DisplayName,和C.FMemo等(只取日期最新的一条,没有纪录则取null)

个位高手在帮忙看看,等下我在开个帖子

nik_Amis 2008-06-06
  • 打赏
  • 举报
回复

SELECT a.ID, a.UID, a.FItemID, a.FInterID, a.FEntryID, a.FSupplyID, a.FSupplyName,
a.FBillNo, a.FItemIDName, a.FItemName, a.FItemModel, a.FUnitIDName, a.FAuxQty,
a.FEntrySelfP0242, a.FEntrySelfP0243, a.FAuxTaxPrice, a.FAllAmount, a.FCess,
a.FCurrencyIDName, a.FEntrySelfP0241, a.FMrpClosed, a.FCancellation, a.FDate,
b.DisplayName, c.FMemo, c.FDate AS FDDate, a.FSendDate
FROM dbo.TB_Order a LEFT JOIN
dbo.TB_User b ON a.FSupplyID = b.SID LEFT JOIN
dbo.TB_Feedback c ON a.FItemIDName = c.FItemIDName AND
a.FBillNo = c.FBillNo AND c.FDate=
(SELECT MAX(FDATE)
FROM TB_Feedback
WHERE a.FItemIDName = c.FItemIDName AND a.FBillNo = c.FBillNo)
我实际的语句是这样的,但是取到的纪录中除了c里面纪录日期最新的一条,其他c.FMemo,FDDate都是null,
而不是根据a.FItemIDName = c.FItemIDName AND a.FBillNo = c.FBillNo分组后,每组的日期最新的纪录
nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
现在取得的纪录只有C里面所有纪录日期最新的一条,而不是C跟A关联的每组里面的最新的每一条

不知道我表达清楚了没有。。。
我看语句的逻辑应该是对的,但是就是拿不到其他的每组里面最新的纪录
nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
一直没届帖
正好这个查询还有点问题再问问个位高手

主表A
AID,BID,M
1,2,"X"
2,2,"S"
3,1,"P"

子表B
BID,SupplierName
1,IBM
2,MS

子表C
CID,AID,Memo,FDate,M
1,1,"OK",08-03-02,"X"
2,1,"NO",08-03-01,"X"
3,1,"Cancel",08-01-02,"X"
4,2,"Bad",08-03-02,"S"

A.BID=B.BID, A.AID=C.AID AND A.M=C.M

要求查询结果为
1,2,"X","IBM","OK",08-03-02
2,2,"S","MS","Bad",08-01-02
3,1,"P","IBM",null,null,null

查询的时候只要C里面日期最新的记录的值
select a.*,b.SupplierName,c.V,c.FDate from #A a left join #B b on a.ID=b.ID left join #C c on a.ID=c.AID and c.FDate=(select max(FDate) from #C where AID=c.AID)

我用的小楼的方法,好像不行啊,查出来的纪录只有一条能取到C的Memo,FDate信息,其他的纪录全市null

nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
噢加上了,CSDN反映老慢了
nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
每帖只能加分一次,此帖已加过分,不能再加了

....

CSDN
nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
靠,我加了100分为什么还是120?!!我的100分去那里了
dobear_0922 2008-06-06
  • 打赏
  • 举报
回复
--> 测试数据: #A
if object_id('tempdb.dbo.#A') is not null drop table #A
create table #A (ID int,SupplierID int,M int)
insert into #A
select 1,2,1 union all
select 2,2,11 union all
select 3,1,2
--> 测试数据: #B
if object_id('tempdb.dbo.#B') is not null drop table #B
create table #B (ID int,SupplierName varchar(3))
insert into #B
select 1,'IBM' union all
select 2,'MS'
--> 测试数据: #C
if object_id('tempdb.dbo.#C') is not null drop table #C
create table #C (ID int,AID int,V int,FDate datetime)
insert into #C
select 1,1,32,'08-03-02' union all
select 2,1,24,'08-03-01' union all
select 3,1,13,'08-01-02' union all
select 4,2,34,'08-03-02'

select a.*,b.SupplierName,c.V,c.FDate
from #A a left join #B b on a.ID=b.ID left join #C c on a.ID=c.AID
where C.AID is null or c.FDate=(select max(FDate) from #C where AID=c.AID)

/*
ID SupplierID M SupplierName V FDate
----------- ----------- ----------- ------------ ----------- -----------------------
1 2 1 IBM 32 2002-08-03 00:00:00.000
2 2 11 MS 34 2002-08-03 00:00:00.000
3 1 2 NULL NULL NULL

(3 row(s) affected)
*/

drop table #A, #B, #C
dobear_0922 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 nik_Amis 的回复:]
...
[/Quote]
???
nik_Amis 2008-06-06
  • 打赏
  • 举报
回复
...
Amy08 2008-06-06
  • 打赏
  • 举报
回复

select a.*, b.SupplierName, c.V, c.FDate
from A a left join B b on A.SupplierID=B.ID
left join (select AID, max(FDate) as date from c group by AID) c on a.ID=c.AID
nik_Amis 2008-05-19
  • 打赏
  • 举报
回复
偶明天加了分在结贴,CSDN老烦了。。。
nik_Amis 2008-05-19
  • 打赏
  • 举报
回复
查询基本没啥问题,欧自己在研究下
事物的问题是为啥?
liangCK 2008-05-19
  • 打赏
  • 举报
回复
弄成存储过程
nik_Amis 2008-05-19
  • 打赏
  • 举报
回复
FDate跟MDate不一样的,一个是主表的MDate,一个是子表的FDate
liangCK 2008-05-19
  • 打赏
  • 举报
回复
学习..
小楼的自动生成表的存储过程很好用.. :)
加载更多回复(28)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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