[OT - Ayuda con una consulta SQL Simple]

14/01/2009 - 12:52 por Francisco J Lopez | Informe spam
Buen día Amigos,

Tengo dos tablas en una base de datos:

+++ Iniciados +++
campoNumero
campoAño
campo...
campo...

+++ Terminados +++
campoNumero
campoAño
campo...
campo...

Necesito construir una consulta que me devuelva TODOS los registros de
la tabla INICIADOS que NO EXISTAN en la tabla TERMINADOS cuyo criterio
de comparación serian los campos CAMPONUMERO y CAMPOAÑO.

Alguien podria ayudarme con esto?

Saludos,

Francisco

Preguntas similare

Leer las respuestas

#1 Francisco J Lopez
14/01/2009 - 14:20 | Informe spam
Hola Ferg / Carlos,

Gracias por responder. Les comento que noto algo muy curioso y es que la
consulta planteada por Carlos me devuelve 1 registro más que la de Ferg
(372 contra 373) ¿? Voy a revisar esto ahora mismo.

Estoy usando MS Access para hacer las pruebas.

Igualmente el problema estaria resuelto por lo que agradezco enormemente
la ayuda de ambos.

Saludos y hasta pronto!

Francisco

Carlos Sacristan escribió:
Una opción más sencilla que la que comenta Ferg podría ser

SELECT t1.*
FROM iniciados t1 LEFT JOIN terminados t2
ON t1.campoNumero=t2.campoNumero AND t1.campoAño=t2.campoAño
WHERE t2.campoAño IS NULL


Respuesta Responder a este mensaje
#2 ferg
14/01/2009 - 14:27 | Informe spam
DEBERÍAS PROBAR CON LO SIGUIENTE...
SQL = "SELECT * FROM TERMINADOS WHERE
(campoNumero + campoAño) NOT IN
(SELECT (campoNumero + campoAño) FROM INICIADOS)

Deberás tener en cuenta que para que funcione estás armando un nuevo campo
con el contenido de los 2 campos (campoNumero + campoAño) por consiguiente
deberás lograr que tenga siempre el mismo formato/estructura.
O sea; si campoNumero = "0001" y campoAño="2008" estarías obteniendo el
valor "00012008" o al reves si así lo prefieres (campoAño + campoNumero);
pero considerando que tenga siempre una determinada longitud y formato.
Considera también que si campoNumero y/o campoAño es de tipo numérico
deberías convertirlo a string con alguna funcion del motor tal como
SQL_CONVERT/CONVERT o la que fuere (para que el campo a obtener sea de tipo
string y no te "sume" los valores de los campos constituyentes, sino que te
tome el campo final como una cadena), y a su vez llevarlo a una cantidad de
caracteres en función de la cantidad maxima de ese campo, por ejemplo si
campoNumero puede llegar como máximo a 9999, entonces deberías formatearlo
con cuatro "0", para que si tienes el valor =1 quede "0001" al igual que si
tienes 999 quede "0999", y de esa forma obtendrás siempre la misma longitud
de cadena... esto todo con funciones SQL

Bueno.
Espero que te sirva.
Saludos.
Fernando

Ing. Fernando D. Giletta
San Francisco. Córdoba. Argentina.


"Francisco J Lopez" escribió en el mensaje
news:%

Buen día Amigos,

Tengo dos tablas en una base de datos:

+++ Iniciados +++
campoNumero
campoAño
campo...
campo...

+++ Terminados +++
campoNumero
campoAño
campo...
campo...

Necesito construir una consulta que me devuelva TODOS los registros de la
tabla INICIADOS que NO EXISTAN en la tabla TERMINADOS cuyo criterio de
comparación serian los campos CAMPONUMERO y CAMPOAÑO.

Alguien podria ayudarme con esto?

Saludos,

Francisco


Respuesta Responder a este mensaje
#3 Francisco J Lopez
14/01/2009 - 14:35 | Informe spam
Ferg,

Si, me dí cuenta pero como la idea era la misma invertí el nombre de las
tablas.
Igualmente te comento que la consulta es mucho más compleja así que
inventé este ejemplo para ilustrar mi duda. Lógicamente ahora tengo que
aplicar este concepto a la consulta real.

Saludos y gracias!

Francisco

ferg escribió:
Francisco; no se si te diste cuenta, pero la consulta que te propuse está al
revés ya que devuelve los registros de la tabla terminados, en lugar de los
registros de la tabla iniciados, por lo que deberías invertir los nombres de
las tablas... entonces quedaría
SQL = "SELECT * FROM iniciados WHERE
(campoNumero + campoAño) NOT IN
(SELECT (campoNumero + campoAño) FROM terminados)

Saludos.
Fernando

Ing. Fernando D. Giletta
San Francisco. Córdoba. Argentina.



"Francisco J Lopez" escribió en el mensaje
news:O%
Hola Ferg / Carlos,

Gracias por responder. Les comento que noto algo muy curioso y es que la
consulta planteada por Carlos me devuelve 1 registro más que la de Ferg
(372 contra 373) ¿? Voy a revisar esto ahora mismo.

Estoy usando MS Access para hacer las pruebas.

Igualmente el problema estaria resuelto por lo que agradezco enormemente
la ayuda de ambos.

Saludos y hasta pronto!

Francisco

Carlos Sacristan escribió:
Una opción más sencilla que la que comenta Ferg podría ser

SELECT t1.*
FROM iniciados t1 LEFT JOIN terminados t2
ON t1.campoNumero=t2.campoNumero AND t1.campoAño=t2.campoAño
WHERE t2.campoAño IS NULL






Respuesta Responder a este mensaje
#4 Carlos Sacristan
14/01/2009 - 14:51 | Informe spam
Una opción más sencilla que la que comenta Ferg podría ser

SELECT t1.*
FROM iniciados t1 LEFT JOIN terminados t2
ON t1.campoNumero=t2.campoNumero AND t1.campoAño=t2.campoAño
WHERE t2.campoAño IS NULL


Un saludo
-
www.navento.com
Servicios de Localización GPS


"Francisco J Lopez" wrote:


Buen día Amigos,

Tengo dos tablas en una base de datos:

+++ Iniciados +++
campoNumero
campoAño
campo...
campo...

+++ Terminados +++
campoNumero
campoAño
campo...
campo...

Necesito construir una consulta que me devuelva TODOS los registros de
la tabla INICIADOS que NO EXISTAN en la tabla TERMINADOS cuyo criterio
de comparación serian los campos CAMPONUMERO y CAMPOAÑO.

Alguien podria ayudarme con esto?

Saludos,

Francisco



Respuesta Responder a este mensaje
#5 ferg
14/01/2009 - 15:21 | Informe spam
Francisco; no se si te diste cuenta, pero la consulta que te propuse está al
revés ya que devuelve los registros de la tabla terminados, en lugar de los
registros de la tabla iniciados, por lo que deberías invertir los nombres de
las tablas... entonces quedaría
SQL = "SELECT * FROM iniciados WHERE
(campoNumero + campoAño) NOT IN
(SELECT (campoNumero + campoAño) FROM terminados)

Saludos.
Fernando

Ing. Fernando D. Giletta
San Francisco. Córdoba. Argentina.



"Francisco J Lopez" escribió en el mensaje
news:O%
Hola Ferg / Carlos,

Gracias por responder. Les comento que noto algo muy curioso y es que la
consulta planteada por Carlos me devuelve 1 registro más que la de Ferg
(372 contra 373) ¿? Voy a revisar esto ahora mismo.

Estoy usando MS Access para hacer las pruebas.

Igualmente el problema estaria resuelto por lo que agradezco enormemente
la ayuda de ambos.

Saludos y hasta pronto!

Francisco

Carlos Sacristan escribió:
Una opción más sencilla que la que comenta Ferg podría ser

SELECT t1.*
FROM iniciados t1 LEFT JOIN terminados t2
ON t1.campoNumero=t2.campoNumero AND t1.campoAño=t2.campoAño
WHERE t2.campoAño IS NULL

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida