PDA

Ver la Versión Completa : Interseccion en Firebird


sandiamo
28-09-2007, 12:38:28
Cual es el operador de Interseccion en Firebird?. Se que es una cosa simple pero he estado buscando informacion y no he encontrado nada y no me funciona el operador INTERSECT.
Gracias

duilioisola
28-09-2007, 12:45:52
JOIN quizas?

select * from tabla1 T1
join tabla2 T2
on T1.id=T2.id
where
T1.campo>=10

jhonny
28-09-2007, 15:50:09
Tengo entendido que INTERSECT es la union de dos consultas y al final nos muestra como resultado una unica consulta...

En FireBird, eso se hace con UNION y UNION ALL... ¿Cual es la diferencia?, UNION mostrara los datos agrupados, osea que si un registro de la primera consulta es igual a un registro de la segunda solo mostrara uno, mientras que con UNION ALL mostrara las dos (O mas segun sea el caso).

¿Como se usa?, no se si sera igual en SQL Server y el INTERSECT, pero aca es asi, por ejemplo:

select Area, Empleado, Sueldo from Tabla1

UNION

select Area, Empleado, Sueldo from Tabla2

Hay que tener en cuenta que los campos de las dos consultas deben ser del mismo tipo y tamaño, pero si no lo son y los necesitamos, podriamos hacer uso del cast.

Espero te sirva ;).

sandiamo
28-09-2007, 18:54:28
Hola
La cuestion es que UNION y UNION ALL muestran la union de dos selecciones (sin repetidos y con repetidos) y con INTERSECT yo lo que necesito son exactamente la interseccion o sea los repetidos.
Gracias

jhonny
28-09-2007, 19:14:25
Hola
La cuestion es que UNION y UNION ALL muestran la union de dos selecciones (sin repetidos y con repetidos) y con INTERSECT yo lo que necesito son exactamente la interseccion o sea los repetidos.
Gracias

A ver, lo que ahora te entiendo es que puedas hacer una union como con el UNION, pero que solo te muestre los que estan repetidos, si es asi, puedes hacer lo siguiente, usando FireBird 2.0:


select count(*), tipo, codigo from (


select tipo, codigo from tabla_prueba
group by tipo, codigo

union all

select tipo, codigo from tabla_prueba
group by tipo, codigo)


group by tipo, codigo
having count(*) > 1


Adapta ese ejemplo a tu necesidad y nos cuentas como te va ;).

sandiamo
28-09-2007, 20:03:05
Hola

Gracias la solucion que alcance es muy parecida a la que me has dado. Yo lo que trataba era mejorar el tiempo de respuesta de la consulta y al final el codigo que puse fue algo asi:


SELECT DISTINCT T1.CODIGO, T1.MARCA, T1.MODELO
FROM TABLA1 T1, TABLA2 T2
WHERE (T1.CAMPO4<>'T')AND(T1.CAMPO5<>'T')AND(T1.CODIGO=T2.CODARTICULO)AND((T2.CAMPO2<>'T')OR(T2.CAMPO2 IS NULL))
UNION
SELECT DISTINCT T1.CODIGO, T1.MARCA, T1.MODELO
FROM TABLA1 T1, TABLA3 T3
WHERE (T1.CAMPO4<>'T')AND(T1.CAMPO5<>'T')AND(T1.CODIGO=T3.CODARTICULO)


Saludos y Gracias por vuestro tiempo

duilioisola
01-10-2007, 09:08:33
Prueba la consulta usando JOIN y sin el DISTINCT.

El UNION ya te devuelve la union de las dos consultas sin repetir los resultados duplicados.
El JOIN quizás te haga la consulta más rápida (eficiente, menos lecturas, etc.)

SELECT T1.CODIGO, T1.MARCA, T1.MODELO
FROM TABLA1 T1
JOIN TABLA2 T2
ON (T1.CODIGO=T2.CODARTICULO)
WHERE (T1.CAMPO4<>'T')AND(T1.CAMPO5<>'T')AND((T2.CAMPO2<>'T')OR(T2.CAMPO2 IS NULL))
UNION
SELECT T1.CODIGO, T1.MARCA, T1.MODELO
FROM TABLA1 T1
JOIN TABLA3 T3
ON (T1.CODIGO=T3.CODARTICULO)
WHERE (T1.CAMPO4<>'T')AND(T1.CAMPO5<>'T')