SELECT xiongkahao as 胸卡号, xingming as 姓名, xingbie as 性别, danweimc as 单位, gangweimc as 岗位, laobaomc as 劳保, shuliang as 数量, guige as 规格, lingqusj as 领取时间, jldanwei as 计量单位 FROM gerenjilu Where (DATEADD(month,( SELECT Top 1 qixian FROM gangweilaobao WHERE (gangweimc = '" + gangweimcTextBox.Text.ToString() + "')), lingqusj) < GETDATE()) AND (xiongkahao = '" + xiongkahaoTextBox.Text.ToString() + "')这条语句只能查出一条与劳保名称相对应的劳保用品到期的列表,问题是相同岗位的劳保用品有好几种并且每种的周期都不一样,怎么写语句才能把到期该更换的物品都查询出来?gangweilaobao表
-------------------------
gangweimc   laobaomc   qixiangerenjilu 表
-------------------------
xiongkahao  xingming  xingbie danweimc gangweimc laobaomc shuliang  guige  lingqusj jldanwei 其中个人记录表里gangweimc laobaomc和岗位劳保表里的gangweimc laobaomc相对应 也要用到岗位劳保表里的qixian字段和个人记录表里的lingqusj做日期比较告诉我该怎么做 先谢谢了!!!

解决方案 »

  1.   

    你的语句又长又乱,select就from一个表,用selcet *应该简洁很多吧,建议数据库不要用中文,也不要用中文拼音,应该尽量用英文来表达,这样可读性会好点。
      

  2.   

    @"SELECT x.xiongkahao as 胸卡号, x.xingming as 姓名
    FROM gerenjilu as x 
    inner join gangweilaobao as g 
      on g.gangweimc=x.ganweimc and g.laobaomc=x.laobaomc
    where DATEADD(month,g.qixian,x.lingqusj) < GETDATE()
      and x.gangweimc = '" + gangweimcTextBox.Text.ToString() + "'
      and x.xiongkahao = '" + xiongkahaoTextBox.Text.ToString() + "'"另外,你的ganweilaobao表需要将(gangweimc,laobaomc)设置为主键或者唯一(unique)索引。如果不满足唯一约束,这个查询可能是错误的(有重复的)。
      

  3.   

    谢谢 sp1234(半梦半醒之间,情人沙漠上好像只有我一颗不死的种子。) 可以用 不过改成
    SELECT     x.xiongkahao AS 胸卡号, x.xingming AS 姓名, x.laobaomc AS 劳保
    FROM         gerenjilu AS x INNER JOIN
                          gangweilaobao AS g ON g.gangweimc = x.gangweimc AND g.laobaomc = x.laobaomc
    WHERE     (DATEPART(year, DATEADD(month, g.qixian, x.lingqusj)) = DATEPART(year, @time)) AND (DATEPART(month, DATEADD(month, g.qixian, x.lingqusj)) 
                          = DATEPART(month, @time)) AND (x.gangweimc = @gangweimc) AND (x.xiongkahao = @xiongkahao)因为更换的单位时间是月 所以我加了datepart 不知道对不对 比较也改成=了 这样对单个职工可以查到当月该发的劳保,但是要查出每个单位的该发的物品不知道是在程序里写循环还是用sql就可以了