PDA

Ver la Versión Completa : Inner Join del SQL Server


Mauro.NET
03-04-2005, 05:33:02
Hola, estoy trabajando en mi empresa con Delphi 6, y estoy usando el motor de base de datos Sybase y estoy empezando a migrar a SQL Server 2000.

En Sybase se puede usar INNER JOIN sin agregarle [ON <condiciones>] y todas las consultas las tengo sin ese ON. En SQL Server veo que debe especificarse dichas condiciones, lo cual me llevaria mucho tiempo la migracion.

Quiero saber si hay forma de hacer las consultas sin el ON en SQL Server, o algo para simplificar un poco la cosa...

Gracias!!

jachguate
04-04-2005, 18:49:11
No se si sql server soporte la sintaxis sugerida en el estándar SQL-99 (si no mal recuerdo) para estos casos, que es cross join.

Si lo analizas, verás que el problema está originalmente en Sybase... que no tiene sentido hacer un inner join sin clausula on.

Igual, para efectos de "agilizar" la migración, podes añadirle a todas las consultas una clausula on que siempre devuelva True.

Por ejemplo:


Select *
from tabla1 t1 inner join tabla2 t2 on 1 = 1;


Es una sentencia válida para el estándar, y estoy seguro que también para sqlserver.

Hasta luego.

;)

Mauro.NET
07-04-2005, 05:09:38
Estor tratando de migrar una base de datos muy grande en Sybase hacia SQL Server 2000, y el motor del sybase me permite hacer un "INNER JOIN" sin incluir "ON" (este es opcional)

Por ejemplo:

En Sybase puedo hacer (y deseo seguir haciendo)

SELECT * FROM Paises INNER JOIN Provincias INNER JOIN Ciudades

En SQL Server

SELECT * FROM Paises P INNER JOIN Estados E ON P.CodPais=E.CodPais
INNER JOIN Ciudades C ON E.CodEstado=C.CodEstado

me resulta muy poco amigable a la hora de migrar.

Alguien sabe como safar de este problema?

Neftali [Germán.Estévez]
07-04-2005, 09:00:52
No creo que puedas (estoy casi seguro) hacer los JOIN's en SQL sin colocar el ON. Creo que loo vas a tener que hacer "a mano"; En todo caso te podrias hacer un programita al que le pasaras una sentencia SQL y te los añadiera, pero no veo mucho más...

__hector
07-04-2005, 15:01:16
Me causa curiosidad saber como Sybase asume automaticamente cuales campos utilizara en los JOIN

Supongo que es para un caso muy particular, determinando los primary keys y foreign keys, pero eso no forma parte de los estandares SQL/92 y SQL/99

Neftali [Germán.Estévez]
07-04-2005, 15:36:19
Yo he supuesto que era por los nombres de campo, pero tb tengo curiosidad.

jachguate
07-04-2005, 16:11:53
Que de esto no es de lo que ya estabamos hablando en este otro hilo ?

:confused:

Neftali [Germán.Estévez]
07-04-2005, 17:33:33
Que de esto no es de lo que ya estabamos hablando en este otro hilo?
Cierto.
Los he "juntado" y movido al foro de SQL Server que parece que es donde deben estar.

Mauro.NET
09-04-2005, 05:39:33
Disculpen que me demoré en responder. Afirmo al 100% que en Sybase SQL Anywhere 5.0 se puede hacer INNER JOIN sin agregar "ON". Y no es para ninguna consulta particular, ya que para Sybase te devuelve los mismos registros si le pones el "ON" o no. Tambien la misma regla es para LEFT ó RIGHT OUTER JOIN. Es obvio que tenes que definir previamentelas relaciones entre las tablas. Tengo stored procedures con mas de 100 lineas de codigo SQL y de esta manera es mucho mas legible el codigo (gran ventaja) y en SQL Server no veo forma de hacer esto asi. :( tendre que hacer un programita que me agregue ese "ON" al codigo. Yo probe el CROSS JOIN del SQL Server y te devuelve (por ejemplo) que todos los empleados trabajan en todos los departamentos.

Saludos.

Neftali [Germán.Estévez]
11-04-2005, 09:29:19
...Afirmo al 100% que en Sybase SQL Anywhere 5.0 se puede hacer INNER JOIN sin agregar "ON"...
El problema que le veo a esto es que "no siempre" puedes aplicar ésto, es decir, habrá veces que puedas no ponerlo, pero habrá otras, que estés obligado a hacerlo, y esa diferencia no acaba de convencerme. Por ejemplo no es tan raro el caso en que dos tablas estén relacionadas entre sí por más de una relación:
* Puerto_origen, puerto_destino (relaciones entre viaje-Puerto)
* Población_Residencia, población_nacimiento...
* Empresa, empresa_facturacion
* ...
En estos casos el sistema es incapaz de resolver esa JOIN.

jachguate
11-04-2005, 16:07:34
Afirmo al 100% que en Sybase SQL Anywhere 5.0 se puede hacer INNER JOIN sin agregar "ON".

Esto podria llamarse un Natural Join, aunque ahora no recuerdo si esto es parte de algún estándar o de la jerga de algún motor en partícular. Como ya te han apuntado antes, no siempre es posible resolverlo, y la verdad es la primera vez que escucho de un motor que permita esta sintaxis en un inner join.

Si planeas soportar mas motores en el futuro, es buena idea que diseñes sentencias tan apegadas al estándar como sea posible.

Hasta luego.

;)