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

Paoti 28-08-2007 15:45:09

Haber Karlaoax <--- crei que tu nick hacia referenciaa Oaxaca.



mmmmh, veamos



en la sentencia hay dos where, uno para cada tabla, el rpimer where su ámbito es solamente a la tabla que hace referencia, y el segunod where solo su ambito es a la tabla que hace referencia, no quiere decir que si haces un filtro, te va a filtrar la misma información de ls dos tablas....



es eso o no es eso,



Saludos y bien día a todos

karlaoax 28-08-2007 17:59:45

Cita:

Empezado por Paoti (Mensaje 226532)
Haber Karlaoax <--- crei que tu nick hacia referencia Oaxaca.

en la sentencia hay dos where, uno para cada tabla, el rpimer where su ámbito es solamente a la tabla que hace referencia, y el segunod where solo su ambito es a la tabla que hace referencia, no quiere decir que si haces un filtro, te va a filtrar la misma información de ls dos tablas....

No no soy de Oaxaca, pero me gusta esa ciudad, soy de Monterrey N.L.

Entonces traduciendo lo expuesto: No podre hacer una busqueda en ambas tablas segun entiendo, aun cuando quiera ver los resultados de Nissan con Clave='9', me seguira mostrando un Peugeot.

Y lo que yo quiero es, cuando escriba una clave Nissan, efectivamente me muestre una Nissan, etc.

Perdon pero no soy de lArea Informatica y en ocasiones me cuesta entender la terminologia

Paoti 28-08-2007 18:37:23

oky,


ahi va....


haber si me explico.

Código SQL [-]
SELECT clave,nombre FROM Peugeot   
WHERE clave='PAOTI';            
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='6';


Como no hay ningun peugeot con clave 'PAOTI' solo te traera nissan.


Código SQL [-]
SELECT clave,nombre FROM Peugeot   
WHERE clave='11';            
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='PAOTI';


aqui viceversa


Código SQL [-]
SELECT clave,nombre FROM Peugeot   
WHERE clave='NADA';            
UNION
SELECT clave,nombre FROM Nissan
WHERE clave='NADA';

este select no te tare nada..


ahora con

Código SQL [-]
SELECT clave,nombre FROM Peugeot   
UNION
SELECT clave,nombre FROM Nissan


te trae todos....



P.S. no soy de Mty, pero ando viviendo aquí. mi cel es 81 11 7887 11, así me llamo Paoti. vivo en bariro antiguo por si tienes oportunidad de ir y te llavas la laptop

karlaoax 29-08-2007 15:16:29

Mira, de todas formas cuando tu introduces una clave q es Nissan '9' siempre te muestra un auto Peugeot, a eso me refiero. Y sigo sin saber por que :confused:

Cuando introduces una Clave='11' es Null por no existir dicho registro.

AzidRain 29-08-2007 17:06:29

Con todo respeto karlita, me parece que seria mejor que nos dijeras en lenguaje llano que es lo que quieres que te muestre.

Ya sabemos que tienes 2 listas de modelos de coches de marcas distintas (nissan y peugeot).

Ahora de ahi que es lo que quieres que te de la consulta. Olvidate de SQL por un momento y ponlo en palabras normales.

Por otra parte eso de null no tiene razón de ser ya que lo que hace UNION es unir las filas resultantes de un query con las de otro sin mas ni más. Si un where no coincide ningún registro no devolverá ninguna fila. En caso de que ninguno de los dos wheres se cumpla simplemente no tendremos ninguna fila en el query resultante no un null. El valor null unicamente se aplica a valores de columnas.

Un dato importen para que UNION funcione las tablas deben tener el mismo numero de columnas.

AzidRain 29-08-2007 17:15:13

Contestandome solo y sugierendo algo:

Creo que lo que quieres es que dada una clave cualquiera, obtengas a que marca y modelo corresponde.

La solución es muy simple: utiliza una sola tabla para almacenar todos los modelos asi:

TABLA AUTOS

Clave: Int
Marca: varchar
Modelo: varchar


El campo marca correspondería con el nombre de las tablas que tienes en este momento, para este caso sería "Nissan" y "Peugeot".

Ahora si, cada auto tiene su clave asignada por lo que bastaria un simple:

Código SQL [-]
  select marca,nombre from autos where clave='1'
para que te devuelva el modelo Nissan que mencionabas, pero si en vez de uno le pones 6, te devolvera el modelo Peugeot.

Quien sabe quien diseño ese esquema de tablas porque está mal. Pero bueno sabemos que no es tu culpa.

karlaoax 29-08-2007 17:25:16

El manejador que utilizo es MySQL.

Cita:

Empezado por AzidRain (Mensaje 226781)
La solución es muy simple: utiliza una sola tabla para almacenar todos los

Y no quiero utilizar 1 sola tabla, se que es mas facil, por que ya he hecho pruebas :rolleyes:

Y lo de los autos, es solo una prueba antes de implantarlo en un sistema que estoy modificando, el cual utiliza 2 tablas distintas, bueno casi similares en campos.

PS. No te enojes :o


La franja horaria es GMT +2. Ahora son las 16:36:35.

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