以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]如何写多条件关联?避免选择后记录重复 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=60883) |
||||
-- 作者:whyfoxtable -- 发布时间:2014/12/3 11:42:00 -- [求助]如何写多条件关联?避免选择后记录重复 前提:有三个表 表A(各种学校的期间对照表)的字段如下 学校类型 期间标志 期间 中专 2009 2009年 大专 2013 2013年 中专 2011 2011年 本科 2011 2011年 本科 2012 2012年 大专 2014 2014年 大专 2015 2015年 本科 2013 2013年 本科 2014 2014年 中专 2012 2012年 表B(各种学校各教学任务对照表)的字段如下 学校类型 教学任务 开始期间 结束期间 中专 语文 2009 2009 大专 英语 2013 2014 中专 英语 2009 2010 本科 微积分 2012 2014 本科 数据结构 2011 2012 大专 C语言 2013 2013 大专 线性代数 2013 2015 本科 英语 2011 2014 本科 基础化学 2012 2012 中专 概率论 2010 2011 表BC某种学校某教学任务)的字段如下 学校类型 教学任务 本科 微积分 希望得到: (表c所列教学任务各期间明细表,即以下表) 学校类型 教学任务 期间 期间标志 本科 微积分 2012年 2012 本科 微积分 2013年 2013 本科 微积分 2014年 2014 拟写如下语句: Select b.[学校类型] ,b.[教学任务] ,a.[期间] , a.[期间标志] From ({表A} a Left Join {表B} b On a.[期间标志] Between b.[开始期间] And b.[结束期间]) Left Join {表C} c On b.[学校类型] = C.[学校类型] And b.[教学任务] = c.[教学任务] 执行sql测试时,报错如下: 两个操作符之间没有 And 在查询表达式 \'a.[期间标志] Between b.[开始期间]\' 中。 经查,on 后面的关联条件要用括号含住。改之后的语句如下 Select b.[学校类型] ,b.[教学任务] ,a.[期间] , a.[期间标志] From ({表A} a Left Join {表B} b On (a.[期间标志] Between b.[开始期间] And b.[结束期间])) Left Join {表C} c On b.[学校类型] = C.[学校类型] And b.[教学任务] = c.[教学任务] 但运行之后,出现重复行。成了原来的2倍记录数. 求助: 如何改写上述语句达到目的?
[此贴子已经被作者于2014-12-3 13:47:44编辑过]
|
||||
-- 作者:有点甜 -- 发布时间:2014/12/3 11:43:00 -- 直接执行SQL语句得到查询表
http://www.foxtable.com/help/topics/2321.htm
http://www.foxtable.com/help/topics/2329.htm
|
||||
-- 作者:whyfoxtable -- 发布时间:2014/12/3 11:49:00 -- 想过,不过是要在程序中的控件使用。。。上面自写的代码报错。。。。 所以想请大师针对性的改代码,看哪出错! 再次请求帮助。。。。
|
||||
-- 作者:有点甜 -- 发布时间:2014/12/3 12:00:00 -- 具体问题,请上传具体例子才能测试。 |
||||
-- 作者:whyfoxtable -- 发布时间:2014/12/3 13:26:00 -- 见附件。。。 请帮忙改一下我上面的语句。。
|
||||
-- 作者:whyfoxtable -- 发布时间:2014/12/3 14:12:00 -- 自己解决如下 Select b.[学校类型] ,b.[教学任务] ,a.[期间] , a.[期间标志] From ({表B} b Left Join {表A} a On ((a.[期间标志] Between b.[开始期间] And b.[结束期间]) And (a.[学校类型] = b.[学校类型]))) Inner Join {表C} c On (b.[学校类型] = C.[学校类型] And b.[教学任务] = c.[教学任务]) |
||||
-- 作者:jspta -- 发布时间:2014/12/3 14:21:00 -- Select c1.* from (Select c.学校类型,c.教学任务,a.期间标志,a.期间 from {表C} As C left outer join {表A} As a on c.学校类型 = a.学校类型) As C1 inner join {表B} As b on c1.学校类型 = b.学校类型 And c1.教学任务 = b.教学任务 And (c1.期间标志 between b.开始期间 And b.结束期间) |
||||
-- 作者:有点甜 -- 发布时间:2014/12/3 14:23:00 -- Select b.[学校类型] ,b.[教学任务] ,a.[期间] , a.[期间标志] From ({表B} b inner Join {表A} a On a.[学校类型] = b.[学校类型]) Inner Join {表C} c On (b.[学校类型] = C.[学校类型] And b.[教学任务] = c.[教学任务]) where a.[期间标志] Between b.[开始期间] And b.[结束期间] |
||||
-- 作者:whyfoxtable -- 发布时间:2014/12/3 14:58:00 -- 感谢感谢,我再消化消化。。。。 真是感谢。特别有点甜的写法最不绕脑子,喜欢。jspta的思路顺便帮我解决了一个很长时间没解决的小问题,他山之石啊。。。。 [此贴子已经被作者于2014-12-3 15:02:52编辑过]
|