Eu tenho um aplicativo Access muito antigo que usa SQL Pass-Through Queries. Esse aplicativo passou por várias atualizações de servidor e, recentemente, migramos para o SQL 2012.
Agora recebo um erro de sintaxe. As duas últimas linhas do código são onde está o problema. Acredito que seja algum tipo de JOIN, mas nunca vi essa sintaxe. Remover o "*" permite que a consulta seja executada, mas deixa de fora os dados. Existe uma substituição fácil dessa sintaxe ou preciso redesenhar essas consultas usando a frase 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
Sua consulta está usando a sintaxe JOIN pré-ANSI (e possivelmente original). Antigamente, a junção de tabelas era feita especificando todas as tabelas, separadas por vírgulas, na
FROM
cláusula e, em seguida, especificando a(s) condição(ões) de junção naWHERE
cláusula. Equacionar o estilo ANSI atual com o estilo antigo oferece a seguinte tabela de opções:TableA.Field = TableB.Field
TableA.Field *= TableB.Field
TableA.Field =* TableB.Field
JUNÇÃO COMPLETA [EXTERIOR]:TableA.Field *=* TableB.Field
{nothing specified to relate the two tables}
A sintaxe pré-ANSI é/foi suportada (às vezes com ligeira variação) pelos vários RDBMSes . No entanto, foi preterido por um tempo no Microsoft SQL Server e foi oficialmente removido no SQL Server 2012 (como você está vendo agora). Isso foi observado na página MSDN Funcionalidade do Mecanismo de Banco de Dados Descontinuada no SQL Server 2012 (da 2ª à última linha na grade).
Em sua consulta, você tem 3 tabelas:
e duas condições LEFT JOIN:
Mas sim, você pode reescrever da seguinte maneira:
Tecnicamente, você não precisa de parênteses em torno das duas
survey_date
condições naWHERE
cláusula, pois todas sãoAND
condições, mas se preferir para facilitar a leitura, tudo bem.Como @ypercube apontou em um comentário sobre esta resposta, a consulta pode ser ainda mais simplificada, pois as 3 subconsultas na
WHERE
cláusula fazem referência à mesma linha da mesma tabela. Então, isso poderia olhar para o seguinte: