necesito un experto en TSQL

09/06/2006 - 04:51 por Gabriel Pravaz | Informe spam
que me ayude a resolver el sig problema:

tengo dos tablas que se parecen a esto (trato de simplificarlo)

Apellidos

idPuesto
Apellido
-

Nombres

idPuesto
Nombre

puede haber uno o ningun registro de la tabla nombres por cada registro de
la tabla apellidos, nunca hay dos o mas.

y quiero hacer una consulta que me devuelva nombres y apellidos segun el
Puesto de trabajo en SQL Estándar (sin utilizar inner joins ni cosas que no
acepten todos los motores de bbdd)

seria algo asi:

SELECT Apellidos.Apellido, Nombres.Nombre
FROM Apellidos, Nombres
WHERE idPuesto = 'argumento' AND Apellidos.idPuesto = Nombres.idPuesto;

EL PROBLEMA es que hay registros de la primer tabla que no tienen
coincidente en la segunda tabla, deben aparecer en la consulta pero esta no
los trae ya que se filtran en el momento en que igualo el campo idPuesto
para hacer el equivalente al Inner Join.

Si la solución es que modifique la estructura de la base de datos, me
encantaría pero ya está hecha así y no se puede tocar. Yo no soy partidario
de hacer varias tablas que tengan relacion 1 a 1, prefiero hacer tablas mas
anchas, pero este caso ya vino así.

Si se tomaron el trabajo de leerlo muchas gracias.
 

Leer las respuestas

#1 Leonardo Azpurua [mvp vb]
09/06/2006 - 06:28 | Informe spam
Hola, Gabriel:

T-SQL no es "SQL Estandar": es T-SQL. De todas maneras, todos los motores de
BBDD soportan las operaciones JOIN (de hecho estan definidas en los
estandares ISO SQL, aunque Oracle parece emplear una sintaxis un poco suya).
De manera que un LEFT JOIN deberia resolverte el problema.

Mi problema con los LEFT JOIN no es lo de la estandarizacion, mas bien que
soy bastante bruto. Hasta ahora he tenido suerte manejando los JOIN
complejos como consultas de UNION:

La consulta decente deberia ser algo como:

SELECT Apellidos.Apellido, Nombres.Nombre
FROM Apellidos LEFT JOIN Nombres
ON Apellidos.idPuesto = Nombres.idPuesto

y se puede reescribir asi:

SELECT Apellidos.Apellido, Nombres.Nombre
FROM Apellidos, Nombres
WHERE Apellidos.idPuesto = Nombres.idPuesto
UNION
SELECT Apellidos.Apellido, '' FROM Apellidos
WHERE NOT idPuesto IN
(SELECT idPuesto
FROM Nombres)

aunque lo mas probable es que si tienes que lidiar con un SGBD que no
entienda el LEFT JOIN, eventualmente darás con otro que no entienda el
UNION.


Salud!



"Gabriel Pravaz" escribió en el mensaje
news:OZ5Mm%
que me ayude a resolver el sig problema:

tengo dos tablas que se parecen a esto (trato de simplificarlo)

Apellidos

idPuesto
Apellido
-

Nombres

idPuesto
Nombre

puede haber uno o ningun registro de la tabla nombres por cada registro
de la tabla apellidos, nunca hay dos o mas.

y quiero hacer una consulta que me devuelva nombres y apellidos segun el
Puesto de trabajo en SQL Estándar (sin utilizar inner joins ni cosas que
no acepten todos los motores de bbdd)

seria algo asi:

SELECT Apellidos.Apellido, Nombres.Nombre
FROM Apellidos, Nombres
WHERE idPuesto = 'argumento' AND Apellidos.idPuesto = Nombres.idPuesto;

EL PROBLEMA es que hay registros de la primer tabla que no tienen
coincidente en la segunda tabla, deben aparecer en la consulta pero esta
no los trae ya que se filtran en el momento en que igualo el campo
idPuesto para hacer el equivalente al Inner Join.

Si la solución es que modifique la estructura de la base de datos, me
encantaría pero ya está hecha así y no se puede tocar. Yo no soy
partidario de hacer varias tablas que tengan relacion 1 a 1, prefiero
hacer tablas mas anchas, pero este caso ya vino así.

Si se tomaron el trabajo de leerlo muchas gracias.

Preguntas similares