我有一个使用 SQL 直通查询的非常旧的 Access 应用程序。此应用程序已通过多次服务器升级得到维护,我们最近升级到 SQL 2012。
我现在收到语法错误。代码的最后两行是问题所在。我相信这是某种 JOIN,但我从未见过这种语法。删除“*”允许查询运行,但会遗漏数据。是否可以轻松替换此语法,或者我是否需要使用 JOIN 措辞重新设计这些查询?
SELECT survey.hole,survey_date,pit,cu,rec,zn, mn,north,east,elevation,
rtrim(min_type) min_type,rtrim(rock_type) rock_type,
rtrim(alt_type) alt_type, rtrim(min_style) min_style
FROM survey,assay,geology
WHERE mined_out IS NULL
AND pit = (SELECT fmpit FROM tyrctl WHERE source = 'export by date')
AND (survey_date >= (SELECT fmdate FROM tyrctl WHERE source = 'export by date')
AND survey_date <= (SELECT todate FROM tyrctl WHERE source = 'export by date'))
AND survey.hole *= assay.hole
AND survey.hole *= geology.hole
您的查询使用的是 pre-ANSI(也可能是原始的)JOIN 语法。回到“那天”,连接表是通过在子句中指定所有表(用逗号分隔)
FROM
然后在子句中指定连接条件来完成的WHERE
。将当前的 ANSI 样式与旧样式等同起来会为您提供以下选项图表:TableA.Field = TableB.Field
TableA.Field *= TableB.Field
TableA.Field =* TableB.Field
全[外部]连接:TableA.Field *=* TableB.Field
{nothing specified to relate the two tables}
各种 RDBMS都支持 pre-ANSI 语法(有时略有不同)。但是,它在 Microsoft SQL Server 中已被弃用一段时间,并在 SQL Server 2012 中被正式删除(如您现在所见)。这在 SQL Server 2012 MSDN 页面(网格中倒数第 2 行)中已停止使用的数据库引擎功能中进行了说明。
在您的查询中,您有 3 个表:
和两个 LEFT JOIN 条件:
但是,是的,您可以将其重写如下:
从技术上讲,您不需要
survey_date
在子句中的两个条件周围加上括号,WHERE
因为它们都是AND
条件,但是如果您更喜欢它的可读性,那就没问题了。正如@ypercube 在对此答案的评论中指出的那样,查询可以进一步简化为,因为
WHERE
子句中的 3 个子查询都引用同一张表的同一行。所以可以看如下: