Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Sql

Hola a todos estoy haciendo una prueba para que al ejecutar una consulta, busque en 2 tablas distintas (NO JOIN).

Ejemplo
tabla NISSAN
clave
nombre

Tabla Peugeot
clave
nombre

mi sintaxis es:
SELECT DISTINCT
*
FROM
pruebita.nissan,
pruebita.peugeot

si muestra el resultado...... pero al querer hacer por medio de WHERE:
SELECT DISTINCT
*
FROM
pruebita.nissan,
pruebita.peugeot
where clave='1';

Mensaje de error: Column clave in where clause is ambiguous

mmmmm, lo unico que quiero implementar, es q por medio de mi sintaxis SQL busque en las dos tablas(NO PARA UNIR), pues quiero mostrar los resultados en DBedits.

Alguna sugerencia? Karla
Responder Con Cita
  #2  
Antiguo 23-08-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No entiendo bien. ¿Quieres un resultado con cuatro columnas (las dos de cada tabla), o con dos columnas pero con los registros de ambas tablas?

Si es lo primero, ¿qué tiene de malo un JOIN? Relamente lo que haces es un JOIN, pero si no pones condiciones lo hace todos contra todos. Si es lo segundo, ¿qué tiene de malo un UNION?

En cualquier caso, puedes desambiguar anteponiendo el nombre de la tabla, por ejemplo:

Código SQL [-]
where pruebita.nissan.clave = 1

¿pruebita es el nombre de la base?

// Saludos
Responder Con Cita
  #3  
Antiguo 23-08-2007
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
Consulta SQL

Hola:

Otra via que pudieras usar si estuvieses usando SQL Server 2000 es crear un Procedimiento Almacenado que incluya una tabla temporal como este ejemplo

Código SQL [-]
CREATE PROCEDURE AcreditacionConsolidada
  @clave1 datetime,
  @clave2 datetime 
AS
CREATE TABLE #temporal
(
 clave1 char(10),
 nombre1 char(20),
 clave2 char(10),
 nombre2 char(20)
)
INSERT INTO #temporal
 
SELECT     clave, nombre, '', ''
FROM       Nissan
WHERE clave = @clave1
UNION ALL
 
SELECT     clave, nombre, '', ''
FROM       Peugeot
WHERE clave = @clave2
 
SELECT clave1, nombre1, clave2, nombre2
FROM #temporal
GO

De esta forma le podrias asignar a los edit los valores de los campos de esta consulta.

Saludos

Luis Garcia
Responder Con Cita
  #4  
Antiguo 23-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Gracias Roman y Lgarcia.... como siempre aclarando mis confusiones

Cita:
Empezado por roman Ver Mensaje
¿qué tiene de malo un UNION?

¿pruebita es el nombre de la base?
UNION no he leido sobre esta clausula, voy a checar la documentacion en linea. Y pruebita si es mi Base de Datos, la cual contiene 2 Tablas: Nissan y Peugeot.

Y si, lo que quiero es mostrar mis resultados de ambas tablas en una sola columna, voy a hacer pruebas y posteo los resultados.
Responder Con Cita
  #5  
Antiguo 23-08-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 22
Paoti Va por buen camino
oye karla, que esta mal eso de

Código SQL [-]

SELECT DISTINCT
*
FROM
pruebita.nissan,
pruebita.peugeot

estas haciendo un producto cartesiano...

la forma correcta es

Código SQL [-]
SELECT * FROM pruebita.nissan WHERE 
union
SELECT * FROM pruebita.peugeot WHERE 


-Paoti
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
Responder Con Cita
  #6  
Antiguo 24-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Cita:
Empezado por Paoti;225443
[SQL
SELECT * FROM pruebita.nissan WHERE <filtro de nissan>
union
SELECT * FROM pruebita.peugeot WHERE <filtro de peugeot>[/sql]
Gracias Paoti, despues de 1 dia leyendo mas acerca de esta Clausula UNION que menciono Roman, ahora ya puedo mostrar mis resultados en una sola columna, esto es: Clave y nombre del auto (Combinacion del Peugeot y Nissan), la sintaxis que hice fue:
Código SQL [-]
SELECT clave,nombre FROM Peugeot               // Existe algun comodin para si son varios campos no los tenga
UNION                                                            que escribir, algo como un *, ya probe pero no me quedo
SELECT clave,nombre FROM Nissan
Hecho con MySQL

Ahora lo voy a traducir para el Delphi 7, implementando un Boton y DBedit, hago pruebas y porteo los resultados
Responder Con Cita
  #7  
Antiguo 24-08-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Tengo una pregunta al respecto:

Veo que esto lo estan usando en MySQL, cuando se usa Union en FireBird este hace una especie de Distinct al resultado de dicha union de consultas, pero para evitar dicho Distinct hay que hacer Union All, ¿En MySQL como trabaja este asunto?, gracias por vuestra atención amigos .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #8  
Antiguo 24-08-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Es igual. Por defecto, se excluyen filas repetidas y se usa union all para incluir todas.

// Saludos
Responder Con Cita
  #9  
Antiguo 24-08-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
Es igual. Por defecto, se excluyen filas repetidas y se usa union all para incluir todas.

// Saludos
Gracias roman .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #10  
Antiguo 24-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Cita:
Empezado por jhonny Ver Mensaje
Gracias roman .
Encontre este link que explica eso del Union + ALL
http://www.plus2net.com/sql_tutorial/sql_union.php
Responder Con Cita
  #11  
Antiguo 24-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Ahora le estoy poniendo una Clausula WHERE:
Código SQL [-]
SELECT clave,nombre FROM Peugeot               
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='1';

Pero me muestra mis 10 registros que tengo: 5 de Nissan y 5 de Peugeot.

Esta mal implementada la clausula Where aqui?
Responder Con Cita
  #12  
Antiguo 24-08-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por karlaoax Ver Mensaje
Ahora le estoy poniendo una Clausula WHERE:
Código SQL [-]
SELECT clave,nombre FROM Peugeot               
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='1';

Pero me muestra mis 10 registros que tengo: 5 de Nissan y 5 de Peugeot.

Esta mal implementada la clausula Where aqui?
Caramba, ya veo, gracias karlaoax por el enlace...

En cuanto a la clausula where que estas usando no le veo ningun problema, ¿No sera que todos los Nissan los tienes con clave 1?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #13  
Antiguo 24-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Cita:
Empezado por jhonny Ver Mensaje
¿No sera que todos los Nissan los tienes con clave 1?
no, tengo de clave 1 .. 5 con diferentes modelos en Peugeot
y de la 6 .. 10 con diferentes modelos en Nissan

Sigo leyendo mas, para encontrar la solucion
Responder Con Cita
  #14  
Antiguo 24-08-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Algo no está bien. El where sólo aplica al select anterior (Nissan en este caso) y no a toda la unión. Si ningún nissan tiene clave=1, debería regresarte sólo los de peugeot.

Si quieres aplicar una condición a toda la unión, puedes hacerlo a través de una subconsulta:

Código SQL [-]
select * from
(
  select name,age from football

  union

  select name,age from baseball
)
as tabla_union

where age >= 21

// Saludos
Responder Con Cita
  #15  
Antiguo 24-08-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 22
Paoti Va por buen camino
es así:


Código SQL [-]

SELECT clave,nombre FROM Peugeot   
WHERE clave='1';            
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='1';

un where para cada consulta

intenatlo, no me hagas mucho caso.
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
Responder Con Cita
  #16  
Antiguo 24-08-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Es tal como dices Paoti.

// Saludos
Responder Con Cita
  #17  
Antiguo 27-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Código SQL [-]

SELECT clave,nombre FROM Peugeot   
WHERE clave='1';            
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='1';

un where para cada consulta

intenatlo, no me hagas mucho caso.

exacto, al fin pude checar tu consejo Paoti, es cierto ahora si, ya puedo mostrar el campo que corresponde a mi clave de auto.

Gracias a todos los que me ayudaron a entender esta sentencia UNION.

Ahora lo voy a pasar a mi delphi.
Responder Con Cita
  #18  
Antiguo 27-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
aunque ya detecte una falla en la sintaxis, por ejemplo, si escribo una clave que no existe Clave="11" en mi resultado
Código SQL [-]
SELECT clave,nombre FROM Peugeot   
WHERE clave='11';            
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='6';

El resultado lo muestra como NULL; Lo que pasa es que en Tabla Peugeot no existe 11, pero en tabla Nissan si existe la 6.

Voy a checar este error.
Responder Con Cita
  #19  
Antiguo 27-08-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 22
Paoti Va por buen camino
no te entendi, con eso de que lo muestra nulo, las sentencias where son independientes, es decir, son propias solo para el ambito sentencia que las esta usando. en este caso, son dos "where" independientes
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz

Última edición por Paoti fecha: 27-08-2007 a las 23:05:46. Razón: Yo y mi forma d eescribir <-- lo ven, yo y mi forma de escribir rápida. (por segunda vez)
Responder Con Cita
  #20  
Antiguo 28-08-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Cita:
Empezado por Paoti Ver Mensaje
no te entendi, con eso de que lo muestra nulo, las sentencias where son independientes, es decir, son propias solo para el ambito sentencia que las esta usando. en este caso, son dos "where" independientes
Si mira, tango 2 tablas: Nissan y Peugeot. de la clave 1 .. 5 con diferentes modelos en Peugeot; y de la 6 .. 10 con diferentes modelos en Nissan.

Ahora si en la sentencia SQL tu pones ejemplo una clave='4' (te muestra un auto de Peugeot) pero si ahora tu pones una 9 (En teoria debe mostrar un auto de la Nissan), pero no lo unico que muestra son claves de la tabla Peugeot.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 04:34:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi