SQL 语句的问题,最后一行的 where 语句为什么无效呢?(100)

  • 主题发起人 主题发起人 ptfjy
  • 开始时间 开始时间
P

ptfjy

Unregistered / Unconfirmed
GUEST, unregistred user!
S:='SELECT a.id, a.货物名称 as 货物名称, a.规格, a.型号, a.颜色, a.千重, b.入库数量, c.出库数量,'; S:=S+' a.数量 AS 库存数量, b.入库金额,c.出库金额 '; S:=S+' FROM dbo.库存表 a LEFT OUTER JOIN '; S:=S+' (SELECT dbo.入库表明细.库存ID, SUM(dbo.入库表明细.数量) AS 入库数量,'; S:=S+' SUM(dbo.入库表明细.金额) AS 入库金额'; S:=S+' FROM dbo.入库表主 INNER JOIN'; S:=S+' dbo.入库表明细 ON dbo.入库表主.编号 = dbo.入库表明细.编号'; S:=S+' WHERE (dbo.入库表主.日期>=:fromdate) and (dbo.入库表主.日期<=:ToDate)'; S:=S+' GROUP BY dbo.入库表明细.库存ID) b ON a.id = b.库存ID LEFT OUTER JOIN'; S:=S+' (SELECT dbo.出库表明细.库存ID, SUM(dbo.出库表明细.数量) AS 出库数量,'; S:=S+' SUM(dbo.出库表明细.金额) AS 出库金额'; S:=S+' FROM dbo.出库表主 INNER JOIN'; S:=S+' dbo.出库表明细 ON dbo.出库表主.编号 = dbo.出库表明细.编号'; S:=S+' WHERE (dbo.出库表主.日期>=:fromdate1) and (dbo.出库表主.日期<=:ToDate1)'; S:=S+' GROUP BY dbo.出库表明细.库存ID) c ON a.id = c.库存ID ';--------------------------------------------因为我想显示某一个货物名称的信息。所以加了下面这一句。 S:=S+' where (a.货物名称 like :HWMQ) ;-----------------------------------------------但是,加了上面的那句后,没有效果。请问该怎么办法?谢谢!
 
楼主那样的做法将导致GROUP BY的后面又多了一个Where子句——而SQL规范中,任何一个部分都只能出现一次,并且不同部分的相对次序也是定死了的。 可以利用嵌套SQL机制: S:='SELECT * FROM (' + S + ') T where (T.货物名称 like :HWMQ)' ;
 
S:='SELECT a.id, a.货物名称, a.规格, a.型号, a.颜色, a.千重, b.入库数量, c.出库数量,'; S:=S+' a.数量 AS 库存数量, b.入库金额,c.出库金额 '; S:=S+' FROM dbo.库存表 a LEFT OUTER JOIN '; S:=S+' (SELECT dbo.入库表明细.库存ID, SUM(dbo.入库表明细.数量) AS 入库数量,'; S:=S+' SUM(dbo.入库表明细.金额) AS 入库金额'; S:=S+' FROM dbo.入库表主 INNER JOIN'; S:=S+' dbo.入库表明细 ON dbo.入库表主.编号 = dbo.入库表明细.编号'; S:=S+' WHERE (dbo.入库表主.日期>=:fromdate) and (dbo.入库表主.日期<=:ToDate)'; S:=S+' GROUP BY dbo.入库表明细.库存ID) b ON a.id = b.库存ID LEFT OUTER JOIN'; S:=S+' (SELECT dbo.出库表明细.库存ID, SUM(dbo.出库表明细.数量) AS 出库数量,'; S:=S+' SUM(dbo.出库表明细.金额) AS 出库金额'; S:=S+' FROM dbo.出库表主 INNER JOIN'; S:=S+' dbo.出库表明细 ON dbo.出库表主.编号 = dbo.出库表明细.编号'; S:=S+' WHERE (dbo.出库表主.日期>=:fromdate1) and (dbo.出库表主.日期<=:ToDate1)'; S:=S+' GROUP BY dbo.出库表明细.库存ID) c ON a.id = c.库存ID';但我在这些代码的后面加了下面这句话,它却是有效的.说明:"货物编号"是库存表中的一个字段. S:=S+' where (货物编号 like :HWBH)';
 
creation-zy,你好!你说的方法我以经试过了,在其他的情况下是行的.但在我的那段代码下还是不行@!-------------------------------------------请问要实现我说的效果,应该将 S:=S+' where (a.货物名称 like :HWMQ) ;放在我上面语句的什么地方呢?------------------------------------还有将最后一句换成 S:=S+' where (货物编号 like :HWBH)'; 则运行正常,不知为什么?说明:"货物编号"也是库存表中的其中一个字段。
 
select * from (你的语句) A WHERE 这里再写条件
 
S:=S+' WHERE (dbo.出库表主.日期>=:fromdate1) and (dbo.出库表主.日期<=:ToDate1) '+ ‘ and (a.货物名称 like :HWMQ) ';问一下,在给参数:HWMQ赋值的时候,有没有加%?你是Query1.ParamByName('HWMQ').AsString :='某个值'还是Query1.ParamByName('HWMQ').AsString :='%某个值%'?
 
我发现了问题的一个奇怪现象:就是最后一句,如果是"货物名称"就不行,但是把它换成"货物编号"或"规格"或"型号"都行. 不知是什么原因.
 
我又发现,如果是"货物名称"中的数据是英文的,则也是正常。如果是"货物名称"中的数据是中文的,则查询结果不正常。不知为什么?-----------------------这个语句能询查出正常的结果(不管"货物名称"中是中文还是英文): S:='Select * from 库存表 where (货物名称 like :HWMQ)';
 
在最后加了 S:=S+' where (货物名称 like :HWMQ)';后,如果下的的参数是英文,如 'FJY',则能找出来,AdoQuery1.Parameters.ParamByName('HWMQ').Value:='%FJY%';-------------------------------但如果下面的参数不是英文,如'电视机',则不能找出来,不知为什么???AdoQuery1.Parameters.ParamByName('HWMQ').Value:='%电视机%';
 
我自已解决了!现在给大家发红包啦!-------------------------------先说一个我的解决办法: S:=S+' where (货物名称 like :HWMQ)'在这里有一个非常奇怪的情况,就是把"货物名称"字段中的内容如果是中文,就不能查找出来.但在另外的表连接中,中文是能查出来的,所以,觉得非常奇怪!所以,我后来不用参数,用了一个变量.把最后一句改为: S:=S+' WHERE a.货物名称 LIKE '+ char(39)+'%法兰螺栓%'+char(39);
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
687
import
I
I
回复
0
查看
605
import
I
后退
顶部