我的查询如下:
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存在):
为什么我的第一个原始查询没有返回结果?我的语法有错误吗?
最佳答案
您的查询没有返回任何内容,因为执行引擎正在使用此特定应用程序 (Sage BusinessVision) 错误引用的索引,您必须解决该问题。
说明:
您遇到的问题与 BusinessVision 创建表 SALES_HISTORY_DETAIL 的索引 index 的方式有关。该表的 PK(索引 key0)位于 NUMBER 列和 RECNO 列上。
有关 BusinessVision 普适索引的详细信息
以下是索引与 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
这将为您提供该表的预期结果,并使用索引来提高性能。
Note that you will get the same behavior in the table 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%'
关于sql - 查询不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17305454/