Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sql (https://www.clubdelphi.com/foros/showthread.php?t=47266)

karlaoax 23-08-2007 02:25:19

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:p

roman 23-08-2007 02:47:00

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

lgarcia 23-08-2007 13:25:55

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

karlaoax 23-08-2007 15:28:34

Gracias Roman y Lgarcia.... como siempre aclarando mis confusiones :p

Cita:

Empezado por roman (Mensaje 225381)
¿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.

Paoti 23-08-2007 15:52:48

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

karlaoax 24-08-2007 18:40:21

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 :cool:

Ahora lo voy a traducir para el Delphi 7, implementando un Boton y DBedit, hago pruebas y porteo los resultados :p

jhonny 24-08-2007 18:48:43

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 :).

roman 24-08-2007 18:54:54

Es igual. Por defecto, se excluyen filas repetidas y se usa union all para incluir todas.

// Saludos

jhonny 24-08-2007 18:58:57

Cita:

Empezado por roman (Mensaje 225840)
Es igual. Por defecto, se excluyen filas repetidas y se usa union all para incluir todas.

// Saludos

Gracias roman :).

karlaoax 24-08-2007 19:09:21

Cita:

Empezado por jhonny (Mensaje 225844)
Gracias roman :).

Encontre este link que explica eso del Union + ALL
http://www.plus2net.com/sql_tutorial/sql_union.php

karlaoax 24-08-2007 19:14:32

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? :rolleyes:

jhonny 24-08-2007 19:25:46

Cita:

Empezado por karlaoax (Mensaje 225853)
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? :rolleyes:

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?

karlaoax 24-08-2007 19:35:14

Cita:

Empezado por jhonny (Mensaje 225856)
¿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

roman 24-08-2007 19:51:11

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

Paoti 24-08-2007 21:42:06

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. :(

roman 24-08-2007 21:45:26

Es tal como dices Paoti.

// Saludos

karlaoax 27-08-2007 21:52:12

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.

:D 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.

karlaoax 27-08-2007 22:00:11

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.

Paoti 27-08-2007 23:01:31

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

karlaoax 28-08-2007 15:25:18

Cita:

Empezado por Paoti (Mensaje 226403)
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 :rolleyes: lo unico que muestra son claves de la tabla Peugeot. :p


La franja horaria es GMT +2. Ahora son las 14:12:48.

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