要实现如下的功能,如何编写SQL语句

zjcxc 2003-03-13 01:06:35
类似下面的一种结果如何编写SQL语句.
有一个表用来保存客户的跟踪记录,表结构如下:
记录日期,客户编号,记录内容
另一个表用来保存客户的资料,表结构如下:
客户ID,客户编号,客户名称,变动日期
其中客户编号为每个客户的唯一编号,客户ID为表的主关键字,无实际意义,因为客户资料经常变动,所以每次变动都为客户重新登记一次,变动日期就用来保存重新登记的日期

我现在想查询客户的跟踪记录,要求返回如下内容:
记录日期,客户编号,客户名称,记录内容
要求客户名称对应回记录时客户的名称.

例如:
客户跟踪记录有如下记录:
2001/1/1,001,"跟踪1'
2001/2/1,001,'跟踪2'

客户资料中有如下记录:
1,001,"A客户",2001/1/1
2,001,'A客户变动1",2001.12/9

则返回结果为:
2001/1/1,001,"A客户","跟踪1'
2001/2/1,001,'A客户变动1",'跟踪2'

应如何编写SQL语句呢?请各位大侠指点.
...全文
24 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-03-20
  • 打赏
  • 举报
回复
这个注意很不错,谢谢 alpha_Ouyang(oyq)老兄
alpha_Ouyang 2003-03-19
  • 打赏
  • 举报
回复
最好的方法是在客户资料中设两个日期,一个是更新日(即你现在定义的日期),还有一个是适用终了日,即该用户下一条变动纪录的更新日-1天。最新的纪录的适用终了日可设为一个非常大的日期。这样用下面sql就行了

SELECT L.RecordDate, L.CustID, C.CustName, L.LogData
FROM LogRecord L INNER JOIN
Customer C ON L.CustID = C.CustID
WHERE L.LogData>=C.更新日 AND L.LogData<=C.适用终了日

alpha_Ouyang 2003-03-19
  • 打赏
  • 举报
回复
效率自然要差一点。但只要客户资料表中的内容不是很多,就不至于很慢。再说可以对[客户编号]建索引。
zjcxc 2003-03-19
  • 打赏
  • 举报
回复
谢谢 alpha_Ouyang(oyq) 老兄,问题已经解决,不过这样的语句执行效率是否很低,在数据量大时应该速度很慢吗?
zjcxc 2003-03-19
  • 打赏
  • 举报
回复
对不起,刚才按错键,现在补充如下:
客户资料表中的内容:
ID 变动日期 客户编号 客户名称
1 2001/1/1 001 A客户
2 2001/12/9 001 A客户变动1
3 2002/1/25 001 A客户变动2
4 2002/5/25 001 A客户变动3

跟踪记录表中的内容:
记录日期 客户编号 记录内容
2001/1/1 001 跟踪1
2001/1/3 001 跟踪2
2002/2/1 001 跟踪3
2002/2/3 001 跟踪4
2002/3/13 001 跟踪5
2002/4/3 001 跟踪6
2002/6/3 001 跟踪7

最后的返回结果:
记录日期 客户编号 客户名称 记录内容
2001/1/1 001 A客户 跟踪1
2001/1/3 001 A客户 跟踪2
2002/2/1 001 A客户变动2 跟踪3
2002/2/3 001 A客户变动2 跟踪4
2002/3/13 001 A客户变动2 跟踪5
2002/4/3 001 A客户变动2 跟踪6
2002/6/3 001 A客户变动3 跟踪7

我的意思是返回的客户名称应该满足条件:客户名称=跟踪记录日期>=最近一次的变动日期
zjcxc 2003-03-19
  • 打赏
  • 举报
回复
首先谢谢 alpha_Ouyang(oyq) 老兄,alpha_Ouyang(oyq)

客户资料中
2,001,'A客户变动1",2001.12/9
中的第二条的日期是2001/12/9号。

我补充一些资料吧,这样会更容易理解:
客户资料表中的内容:
ID客户编号
alpha_Ouyang 2003-03-18
  • 打赏
  • 举报
回复
所以,显示跟踪记录中的客户名应根据[跟踪记录].记录日期>=[客户资料].变动日期 中[客户资料].变动日期最大的一条客户资料。因此,要显示你所要得结果,应将客户资料中

2,001,'A客户变动1",2001.12/9

的变动日期改为小于2001/2/1大于2001/1/1的值,如2001/1/29。然后用下面的sql:

SELECT L.RecordDate, L.CustID, C.CustName, L.LogData
FROM LogRecord L INNER JOIN
Customer C ON L.CustID = C.CustID
WHERE (C.UpdateDate =
(SELECT MAX(c2.UpdateDate)
FROM Customer c2
WHERE L.CustID = C2.CustID AND L.RecordDate >= C2.UpdateDate))

alpha_Ouyang 2003-03-18
  • 打赏
  • 举报
回复
这样也不对.如果你有一条

2002/2/1,001,'跟踪2'

的跟踪记录,这时候应该显示什么客户名呢?
alpha_Ouyang 2003-03-18
  • 打赏
  • 举报
回复
应该行的吧。也许我没有完全理解你的意思。

你说的
客户资料中有如下记录:
1,001,"A客户",2001/1/1
2,001,'A客户变动1",2001.12/9

中的第二条的日期是不是2001/12/9号?
如果是这样就是要显示大于客户跟踪记录更新日期的最早的客户资料。
那sql语句应该如下
SELECT L.RecordDate, L.CustID, C.CustName, L.LogData
FROM LogRecord L INNER JOIN
Customer C ON L.CustID = C.CustID
WHERE (C.UpdateDate =
(SELECT min(c2.UpdateDate)
FROM Customer c2
WHERE L.CustID = C2.CustID AND L.RecordDate <= C2.UpdateDate))

zjcxc 2003-03-15
  • 打赏
  • 举报
回复
alpha_Ouyang(oyq) 老兄,你的方法不行,我用你的SQL语句,结果返回的第二条记录不是变动后的客户资料
zjcxc 2003-03-15
  • 打赏
  • 举报
回复
我想回复zengl(我不知道怎么可以单独回复你,我是新手,这里的论坛是否不支持树形列出问题,像驱动之家的论坛).你的方法是不行的,因为客户资料中的变动日期与客户跟踪记录中的跟踪记录日期不是唯一对应的,你看我提出的要求,其客户变动日期与跟踪记录中的记录日期是不对应的.
linghuchonglzq2000 2003-03-14
  • 打赏
  • 举报
回复
收藏ing...
alpha_Ouyang 2003-03-14
  • 打赏
  • 举报
回复
刚才的sql语句有误

SELECT L.RecordDate, L.CustID, C.CustName, L.LogData
FROM LogRecord L INNER JOIN
Customer C ON L.CustID = C.CustID
WHERE (C.UpdateDate =
(SELECT MAX(c2.UpdateDate)
FROM Customer c2
WHERE L.CustID = C2.CustID AND L.RecordDate >= C2.UpdateDate))
liuyunfeidu 2003-03-14
  • 打赏
  • 举报
回复
我感觉你的哪个表有问题啊。自己客户已经重新登记,为什么他仍然使用原来的编号啊??
alpha_Ouyang 2003-03-14
  • 打赏
  • 举报
回复
可以是可以,只是要用到子查询.
先定义你的表
1.客户跟踪记录表:
表名:LogRecord
各字段:记录日期: RecordDate
客户编号: CustID
记录内容: LogData
2 客户的资料表:
表名:Customer
各字段:客户ID:UID
客户编号:CustID
客户名称:CustName
变动日期:UpdateDate

SQL语句:
SELECT L.RecordDate, L.CustID, C.CustName, L.LogData
FROM LogRecord L INNER JOIN
Customer C ON L.CustID = C.CustID
WHERE (L.RecordDate =
(SELECT MIN(L2.RecordDate)
FROM LogRecord L2
WHERE L2.CustID= C.CustIDAND L2.RecordDate>= C.UpdateDate))
XLYT 2003-03-14
  • 打赏
  • 举报
回复
你应该用两个字段来描述你的客户,一个是客户编号,这个编号对于客户是一一对应的,另外一个是小号,用来说明客户修改资料的信息,类似于版本号的含义。
zengl 2003-03-14
  • 打赏
  • 举报
回复
在表A中加入字段“变更日期”。客户名称——CID

select a.recordDate , a.CID, b.name, a.content from a,b
where a.CID=B.CID AND A.ChangeDate=b.changedate

已经测试通过!
zjcxc 2003-03-14
  • 打赏
  • 举报
回复
表的结构不是有问题,而是确实有困难。因为这是客户维护记录中要用到的,每个客户都有几年的维护期,那么客户的名称或其他资料有可能会发生变化,但必须保留每个客户的变化情况,所以客户编号对于每个客户来说是唯一的,但其名称或其他资料是可变的。而跟踪记录是登记每一次为客户服务的记录,所以在不同时期登记的客户跟踪记录对应的客户记录有可能不同。而解决问题是要在查询将跟踪日期作为参数传递,就好像我自定义一个函数叫[客户名称],专门用来返回指定日期的客户资料,例如:select 跟踪日期,客户编号,客户名称(客户编号,跟踪日期) as 客户名称,跟踪记录 from 客户资料 where 客户) from 客户跟踪记录,这样就可以实现了,不过我想知道不通过自定义函数是否可以实现,因为客户资料中的内容较多,还包含联系人,联系电话,设备配置等。
mg999 2003-03-13
  • 打赏
  • 举报
回复
表的结构有问题,没办法!
springgwn 2003-03-13
  • 打赏
  • 举报
回复
楼主出来说句话呢?
加载更多回复(3)

22,209

社区成员

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

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