我的查询如下:
Select h.ord_no
from sales_history_header h
INNER JOIN sales_history_detail d
ON d.NUMBER = h.NUMBER
WHERE d.COMMENTS LIKE '%3838CS%'
我没有得到如下所示的结果:
但我应该得到结果,因为:
我运行了查询:
Select NUMBER, Comments from SALES_HISTORY_DETAIL WHERE NUMBER LIKE '%0000125199%'
并得到了这个(正如您所看到的那样,其中包含3838CS的评论字段):
并运行此查询:
Select NUMBER, Ord_No from "SALES_HISTORY_HEADER" WHERE NUMBER = '0000125199'
得到了这个(Ord_No存在):
为什么我的第一个原始查询没有返回任何结果?我的语法有错吗?
答案 0 :(得分:3)
您的查询没有返回任何内容,因为执行引擎正在使用此特定应用程序(Sage BusinessVision)错误引用的索引,您必须解决此问题。
您遇到的问题与BusinessVision创建表SALES_HISTORY_DETAIL的索引索引的方式有关。此表的PK(索引key0)位于列 NUMBER 和 RECNO 。
以下是索引与BV一起使用的方式的解释:
如果您运行的查询可以使用索引,那么您将获得更好的性能。不幸的是,普遍计算 NUMBER 的索引的方式本身并不起作用。
--wrong way for this table
Select * from SALES_HISTORY_DETAIL WHERE NUMBER = '0000125199'
--return no result
由于普遍处理索引的方式,你应该得不到任何结果。解决方法是您必须查询PK的所有字段才能使其正常工作。在这种情况下, RECNO 表示从1到999的记录,因此我们可以使用 RECNO>指定所有记录。 0 强>
--right way to use index key0
Select * from SALES_HISTORY_DETAIL WHERE NUMBER = '0000125199' and RECNO > 0
这将为您提供该表所需的结果,并使用具有性能增益的索引。
请注意,您将在表SALES_ORDER_DETAIL
中获得相同的行为
您运行以查看详细信息的查询确实执行了表扫描而不是使用索引。
--the way you used in your question
Select * from SALES_HISTORY_DETAIL WHERE NUMBER LIKE '%0000125199%'
在这种情况下它起作用,不是因为Like关键字而是因为前导'%';删除它,该查询将无法工作,因为引擎将使用奇怪的索引进行优化。
在您的原始查询中,因为您正在引用 d.NUMBER = h.NUMBER 普遍使用索引并且您没有得到任何结果,只需添加修复该查询(和RECNO> 0 )
Select h.ord_no
from sales_history_header h
INNER JOIN sales_history_detail d
ON d.NUMBER = h.NUMBER and RECNO > 0
WHERE d.COMMENTS LIKE '%3838CS%'
答案 1 :(得分:1)
我认为这是因为两个表中的数字都有不同的数据类型
答案 2 :(得分:0)
您的查询没有问题。看起来像数据问题。存储在SALES_HISTORY_DETAIL中的“数字”可能有一些空格。难以判断SS是否存在一些价值空间。
运行以下查询以查看您的SALES_HISTORY_DETAIL表号值是否已正确存储。
Select NUMBER, Comments from SALES_HISTORY_DETAIL WHERE NUMBER = '0000125199'
答案 3 :(得分:0)
评论栏是文字吗?你试过吗
Select h.ord_no
from sales_history_header h
INNER JOIN sales_history_detail d ON d.NUMBER = h.NUMBER
WHERE cast(d.COMMENTS as varchar(max) LIKE '%3838CS%'