Error al ejecutar consulta con varias tablas

Luego de ejecutar una consulta con 3 tablas en SQL Server 2005 el motor me tira el siguiente error:
Mens. 301, Nivel 16, Estado 1, Línea 1
La consulta contiene una petición de combinación externa no válida.
En una de las páginas de Microsoft aparece una solución ante este error
Deshabilitar 'heurística de orden de combinación' con marca de seguimiento 320.
¿Cómo lo soluciono?

1 respuesta

Respuesta
1
Ese tema de deshabilitar heurística es referente al sql 6.5.
Puedes dar más detalles de lo que estas haciendo para ver si hay algún problema ya sea en tu sintaxis o en las consultas.
Gracias por responder. Acá te adjunto mi código, igual el motor no me detecto errores de sintaxis
select count(distinct idprov),count(legajo),pais.idpais,pais.detalle
from alumno,pais,provincia
where pais.idpais *= provincia.idpais and idprov *= provincia
group by pais.idpais,pais.detalle
order by pbi desc
Saludos y espero tu solución
damimg
Viendo tu código ya entiendo el problema, el tema es que estas usando sintaxis de SQL Server 6.5 la cual, por compatibilidad hacia atrás, solo era compatible hasta la version 2000, y ya en 2005 no es compatible.
Me refiero puntualmente a lo sgte: *=    o   =*   esto debe ser reemplazado por left join o right join, para tu caso puedes hacer asi:
select count(distinct idprov),count(legajo),pais.idpais,pais.detalle
from pais right provincia on pais.idpais = provincia.idpais
right join alumno on idprov= provincia
group by pais.idpais,pais.detalle
order by pbi desc
No conozco la estructura de tus tablas pero hago las modificaciones para que entiendas como debería ser y ya tu te encargas de hacer las correcciones del caso.
Brownsea pero tiene que existir una manera que me reconozca *= y =*
Me gustaría que la averigües...
Simplemente no existe en la version SQL Server 2005, así que debes migrar tus relaciones de esa manera y cambiarla por los joins.
Te recomiendo que bajes el Asesor de actualizaciones de Microsoft SQL Server la cual te analizara tu BD y te dirá donde es que tienes que cambiar.
Aclarado el tema de *=
¿De dónde puedo bajar ese asesor?
Saludos
damimg
Brownsea tengo entendido que modificando el nivel de compatibilidad de la data base a 80 no tengo que tener problemas con la notacion *= y =*. Yo lo cambie a 80
Con dos tablas me funciona bien, pero con más de dos tablas me tira este error:
Mens. 301, Nivel 16, Estado 1, Línea 1
La consulta contiene una petición de combinación externa no válida.


Con respecto al ejemplo sigue siendo el mismo de este mismo thread.
Espero tu aclaración.
Saludos
Claro,
Pero si pones que esta en sql 2005 asumí que esta en compatibilidad 90, en compatibilidad 80 no deberías tener problema, pero te sigo recomendando lo mismo, que realices la migración a JOIN ya que tarde o temprano tendrás que hacerlo.
Otra cosa adicional, si tienes tu base de datos en compatibilidad 90 ya no puedes regresar a 80.
No entendí la ultima parte que decís que no se puede volver a una compatibilidad menor.
Con respecto al uso del join
Si tengo estas dos tablas:
Alumno: idalumno, provincia
Provincia: idprovincia, detalle, país
Pais: idpais,habitantes
y el código (solamente te copio el where que es lo que me interesa para la pregunta)
select....
from alumno,provincia,pais
where idpais*=pais and idprovincia*=provincia
como seria el equivalente a join on.....???
Aclaro que *= es left join
Saludos!
Te explico como hacerlo y tu ya hazlo según tu escenario, ¿ok?
select   ...
from tabla1, tabla2, tabla3
where tabla1.id1*= tabla2.id1 and
      tabla2.id2*=tabla3.id2
Por
select ....
from tabla1 left join tabla2 on tabla1.id1= tabla2.id1
left join tabla3 on tabla2.id2= tabla3.id2
Gracias brownsea quedo aclarado el tema.
Igual me quedo una duda, ¿si uso un left join entre la tabla 1 y la tabla 2 también tengo que hacerlo entre la tabla 2 y 3?
Pregunto esto porque en mi consulta
select count(distinct idprov),count(legajo),pais.idpais,pais.detalle
from alumno,pais,provincia
where pais.idpais *= provincia.idpais and idprov *= provincia
group by pais.idpais,pais.detalle
order by pbi desc
si no uso los dos left join no me devuelve TODOS LOS PAISES.
¿Es una regla esto que si uso un left join o right join entre dos tablas también hay que usarlo entre las tablas restantes?
Saludos!
Su use dos left join fue por un ejemplo solamente, te explico que es lo que hace eso:
select ....
from tabla1 left join tabla2 on tabla1.id1= tabla2.id1
left join tabla3 on tabla2.id2= tabla3.id2
Selecciona todos los registros de tabla1 así no haya par en tabla2
Selecciona todos los registros de tabla2 así no haya par en tabla3
Como te digo, tu puedes hacer uso de left join junto con inner join, en ese caso te restringe datos según como pongas el orden de tus join, si necesitas usar inner con left, primero usa un inner y luego left.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas