0

我已经缩小了我的代码范围,我面临的问题是在尝试调整一些代码以包含更多结果时。

数据表供参考:

**OG_InUse**
*C_ID*
E011
E011_A
F012_D


**Csrc**
*C_ID*
E011
F012
G001

因此,在有“_*”的情况下有效但不返回结果的代码

sSql = "SELECT DISTINCT C_ID FROM Csrc WHERE C_ID NOT IN (SELECT DISTINCT C_ID FROM OG_InUse)"

结果:F012 G001

当我尝试扩展上述查询以仅从 OG_InUse 中返回 C_ID 的前 4 个字符(以删除存在 _A 或 _D 等的情况)时,就会出现问题:

sSql = "SELECT DISTINCT C_ID FROM Csrc WHERE C_ID NOT IN (SELECT DISTINCT Left(C_ID, 4) AS C_OG_ID FROM OG_InUse)"

我想导致以下结果(但访问只是继续尝试处理):G001

有什么建议可能导致查询像这样跳闸吗?我的第一个想法是检查别名,但我不确定除了分解它之外如何开始测试它(我已经完成并且我的子查询返回正确的结果集)。

4

2 回答 2

1

您应该始终尝试使用EXISTS而不是IN. 您需要的查询应该使用LIKE关键字。例如:

SELECT DISTINCT C_ID
FROM  CSrc
WHERE NOT EXISTS
(
    SELECT *
    FROM OG_InUse
    WHERE OG_InUse.C_ID LIKE (CSrc.C_ID + '*')
)

编辑

  1. 为此,您需要确保 OG_InUse 上的 C_ID 已编入索引。
  2. 对于有序结果,您可以恢复原始DISTINCT关键字,它对您的结果进行排序(我已经修改了我的答案以显示这一点)

进一步编辑

EXISTS通常优先于子查询,IN因为EXISTS通常不需要对子查询进行完整评估以获得相同的结果,从而减少 CPU 和执行时间。在这种情况下,SELECT *只需要评估子查询以找到第一个匹配的 OG_InUse,即SELECT *不会完整地评估子查询。

于 2013-03-22T20:00:53.870 回答
1

鉴于您有关表格大小的更多信息:

  1. 访问将很快失去动力

  2. 如果您可以将 OG_InUse.C_ID 的后缀分隔到一个单独的字段中,您的查询可以得到更好的优化(但我不知道这是否证明了努力......)

于 2013-03-22T20:40:33.437 回答