Comparar dos tablas

27/06/2008 - 10:35 por Don Juan | Informe spam
Hola a todos
Necesito hacer una query de comparación entre dos tablas de la misma
estructura:
T1: Codigo Accesorio
T2: Codigo Accesorio
Donde el resultado debe ser este:
Codigo AccesorioMas
1 1
2 4
3 6

En donde codigo es el código en común, y AccesorioMas es la comparación
entre T1 y T2 que responde a la pregunta:
Cuántos Accesorios de T1 (del producto en question) NO EXISTEN en T2?

1000 Gracias por su valiosa ayuda!

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
27/06/2008 - 15:43 | Informe spam
Don Juan,

Usa el operador "exists".

select codigo, accesorio
from t1
where not exists (
select *
from t2
where t2.codigo = t1.codigo
)
GO


AMB

"Don Juan" wrote:

Hola a todos
Necesito hacer una query de comparacin entre dos tablas de la misma
estructura:
T1: Codigo Accesorio
T2: Codigo Accesorio
Donde el resultado debe ser este:
Codigo AccesorioMas
1 1
2 4
3 6

En donde codigo es el cdigo en comn, y AccesorioMas es la comparacin
entre T1 y T2 que responde a la pregunta:
Cuntos Accesorios de T1 (del producto en question) NO EXISTEN en T2?

1000 Gracias por su valiosa ayuda!

Respuesta Responder a este mensaje
#2 rafaelSC
27/06/2008 - 18:09 | Informe spam
Holas, con todos.

Alejandro, lamentablemente tu respuesta no funciona.

Juan, prueba esto por favor:

create table t1 (
codigo int,
accesorio int
)
go

create table t2 (
codigo int,
accesorio int
)
go

insert t1 values(1,1)
insert t1 values(1,2)
insert t1 values(1,3)
insert t1 values(1,4)
insert t1 values(2,1)
insert t1 values(3,1)
insert t1 values(3,2)

insert t2 values(1,1)
insert t2 values(1,2)
insert t2 values(2,1)
insert t2 values(3,1)


select t1.codigo,count(*) as accesorioMas
from t1
join t2 on t2.codigo=t1.codigo
where not exists(
select *
from t2
where t2.codigo=t1.codigo and t2.accesorio=t1.accesorio)
group by t1.codigo

Espero que te sirva.

Salu2

Victor
Lima, Peru

"Alejandro Mesa" wrote:

Don Juan,

Usa el operador "exists".

select codigo, accesorio
from t1
where not exists (
select *
from t2
where t2.codigo = t1.codigo
)
GO


AMB

"Don Juan" wrote:

> Hola a todos
> Necesito hacer una query de comparacin entre dos tablas de la misma
> estructura:
> T1: Codigo Accesorio
> T2: Codigo Accesorio
> Donde el resultado debe ser este:
> Codigo AccesorioMas
> 1 1
> 2 4
> 3 6
>
> En donde codigo es el cdigo en comn, y AccesorioMas es la comparacin
> entre T1 y T2 que responde a la pregunta:
> Cuntos Accesorios de T1 (del producto en question) NO EXISTEN en T2?
>
> 1000 Gracias por su valiosa ayuda!
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
27/06/2008 - 19:21 | Informe spam
rafaelSC,

Si la condicion de busqueda / comparacion debe usar ambas columnas, entonces
adiciona tambien [accesorio] en la clausula "where" de el query
correlacionado. Yo no inclui la funcionalidad de contar cuantos deben ser
agregados, solo le di una idea de como atacar el problema. Aqui tienes el
query rectificado.

select codigo, COUNT(*) AS cnt
from t1
where not exists (
select *
from t2
where t2.codigo = t1.codigo AND t2.accesorio = t1.accesorio
)
group by t1.codigo
GO

A proposito, tu query da resultados raros de acuerdo a la data de ejemplo.
Fijate en el codigo 1 por ejemplo:

insert t1 values(1,1)
insert t1 values(1,2)
insert t1 values(1,3)
insert t1 values(1,4)

insert t2 values(1,1)
insert t2 values(1,2)



Cuantas filas en t1 no estan en t2, usando ambas columnas en la busqueda o
comparacion?

Solo dos {(1, 3), (1, 4)}, correcto?

Tu query devuelve "accesorioMas = 4", debido a que en la union usas solo la
columna [codigo].


AMB



"rafaelSC" wrote:

Holas, con todos.

Alejandro, lamentablemente tu respuesta no funciona.

Juan, prueba esto por favor:

create table t1 (
codigo int,
accesorio int
)
go

create table t2 (
codigo int,
accesorio int
)
go

insert t1 values(1,1)
insert t1 values(1,2)
insert t1 values(1,3)
insert t1 values(1,4)
insert t1 values(2,1)
insert t1 values(3,1)
insert t1 values(3,2)

insert t2 values(1,1)
insert t2 values(1,2)
insert t2 values(2,1)
insert t2 values(3,1)


select t1.codigo,count(*) as accesorioMas
from t1
join t2 on t2.codigo=t1.codigo
where not exists(
select *
from t2
where t2.codigo=t1.codigo and t2.accesorio=t1.accesorio)
group by t1.codigo

Espero que te sirva.

Salu2

Victor
Lima, Peru

"Alejandro Mesa" wrote:

> Don Juan,
>
> Usa el operador "exists".
>
> select codigo, accesorio
> from t1
> where not exists (
> select *
> from t2
> where t2.codigo = t1.codigo
> )
> GO
>
>
> AMB
>
> "Don Juan" wrote:
>
> > Hola a todos
> > Necesito hacer una query de comparacin entre dos tablas de la misma
> > estructura:
> > T1: Codigo Accesorio
> > T2: Codigo Accesorio
> > Donde el resultado debe ser este:
> > Codigo AccesorioMas
> > 1 1
> > 2 4
> > 3 6
> >
> > En donde codigo es el cdigo en comn, y AccesorioMas es la comparacin
> > entre T1 y T2 que responde a la pregunta:
> > Cuntos Accesorios de T1 (del producto en question) NO EXISTEN en T2?
> >
> > 1000 Gracias por su valiosa ayuda!
> >
Respuesta Responder a este mensaje
#4 rafaelSC
27/06/2008 - 21:34 | Informe spam
Tienes razon Alejandro :(

Bueno este si debe funcionar:

select a.codigo,count(*) as accesorioMas
from (
select t1.codigo,t1.accesorio
from t1
join t2 on t2.codigo=t1.codigo
where not exists(
select *
from t2
where t2.codigo=t1.codigo and t2.accesorio=t1.accesorio)
group by t1.codigo,t1.accesorio) a
group by a.codigo

Salu2

Victor
Lima, Peru

"Alejandro Mesa" wrote:

rafaelSC,

Si la condicion de busqueda / comparacion debe usar ambas columnas, entonces
adiciona tambien [accesorio] en la clausula "where" de el query
correlacionado. Yo no inclui la funcionalidad de contar cuantos deben ser
agregados, solo le di una idea de como atacar el problema. Aqui tienes el
query rectificado.

select codigo, COUNT(*) AS cnt
from t1
where not exists (
select *
from t2
where t2.codigo = t1.codigo AND t2.accesorio = t1.accesorio
)
group by t1.codigo
GO

A proposito, tu query da resultados raros de acuerdo a la data de ejemplo.
Fijate en el codigo 1 por ejemplo:

> insert t1 values(1,1)
> insert t1 values(1,2)
> insert t1 values(1,3)
> insert t1 values(1,4)

> insert t2 values(1,1)
> insert t2 values(1,2)

Cuantas filas en t1 no estan en t2, usando ambas columnas en la busqueda o
comparacion?

Solo dos {(1, 3), (1, 4)}, correcto?

Tu query devuelve "accesorioMas = 4", debido a que en la union usas solo la
columna [codigo].


AMB



"rafaelSC" wrote:

> Holas, con todos.
>
> Alejandro, lamentablemente tu respuesta no funciona.
>
> Juan, prueba esto por favor:
>
> create table t1 (
> codigo int,
> accesorio int
> )
> go
>
> create table t2 (
> codigo int,
> accesorio int
> )
> go
>
> insert t1 values(1,1)
> insert t1 values(1,2)
> insert t1 values(1,3)
> insert t1 values(1,4)
> insert t1 values(2,1)
> insert t1 values(3,1)
> insert t1 values(3,2)
>
> insert t2 values(1,1)
> insert t2 values(1,2)
> insert t2 values(2,1)
> insert t2 values(3,1)
>
>
> select t1.codigo,count(*) as accesorioMas
> from t1
> join t2 on t2.codigo=t1.codigo
> where not exists(
> select *
> from t2
> where t2.codigo=t1.codigo and t2.accesorio=t1.accesorio)
> group by t1.codigo
>
> Espero que te sirva.
>
> Salu2
>
> Victor
> Lima, Peru
>
> "Alejandro Mesa" wrote:
>
> > Don Juan,
> >
> > Usa el operador "exists".
> >
> > select codigo, accesorio
> > from t1
> > where not exists (
> > select *
> > from t2
> > where t2.codigo = t1.codigo
> > )
> > GO
> >
> >
> > AMB
> >
> > "Don Juan" wrote:
> >
> > > Hola a todos
> > > Necesito hacer una query de comparacin entre dos tablas de la misma
> > > estructura:
> > > T1: Codigo Accesorio
> > > T2: Codigo Accesorio
> > > Donde el resultado debe ser este:
> > > Codigo AccesorioMas
> > > 1 1
> > > 2 4
> > > 3 6
> > >
> > > En donde codigo es el cdigo en comn, y AccesorioMas es la comparacin
> > > entre T1 y T2 que responde a la pregunta:
> > > Cuntos Accesorios de T1 (del producto en question) NO EXISTEN en T2?
> > >
> > > 1000 Gracias por su valiosa ayuda!
> > >
Respuesta Responder a este mensaje
#5 Carlos M. Calvelo
28/06/2008 - 08:14 | Informe spam
Hola Victor,

On 27 jun, 21:34, rafaelSC wrote:
Tienes razon Alejandro :(

Bueno este si debe funcionar:

select a.codigo,count(*) as accesorioMas
from (
        select t1.codigo,t1.accesorio
        from t1
        join t2 on t2.codigo=t1.codigo
        where not exists(
                select *
                from t2
                where t2.codigo=t1.codigo and t2.accesorio=t1.accesorio)
        group by t1.codigo,t1.accesorio) a
group by a.codigo




Aun así, con el ejemplo que tu has puesto,
el resultado es:

codigo accesorioMas
1 2
3 1

pero, dada la pregunta de Don Juan, debería ser:

codigo accesorioMas
1 2
2 0
3 1

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