Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

where (2 campos) Not in (select para dos campos)---MSSQL

Estas en el tema de where (2 campos) Not in (select para dos campos)---MSSQL en el foro de Bases de Datos General en Foros del Web. Saben como puedo hacer un not in por dos campos??? es decir, si tengo la tabla: calle campos: codcomuna - codcalle - descripcion y la ...
  #1 (permalink)  
Antiguo 18/02/2005, 15:45
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 24 años, 2 meses
Puntos: 3
where (2 campos) Not in (select para dos campos)---MSSQL

Saben como puedo hacer un not in por dos campos???

es decir, si tengo la tabla:

calle
campos: codcomuna - codcalle - descripcion

y la tabla:

calle2
campos: codcomuna - codcalle - descripcion

donde la clave unica de ambas tablas está compuesta por codcomuna y codcalle


Hacer un select de esta forma:
select * from calle where codcomuna y codcalle not in
(select codcomuna y codcalle from calle2)

saludos
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
  #2 (permalink)  
Antiguo 22/02/2005, 14:46
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 8 meses
Puntos: 25
La forma mas sencilla es juntar ambos campos en uno solo:

SELECT *
FROM tabla1
WHERE codcomuna + '*' + codcalle NOT IN (
SELECT codcomuna + '*' + codcalle FROM tabla2
)

Pero la manera mas eficiente es usando JOINS (los subquerys son mas pesados para el servidor)

SELECT tabla1.*
FROM tabla1
INNER JOIN tabla2
ON tabla1.codcomuna = tabla2.codcomuna
AND tabla1.codcalle = tabla2.codcalle
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 22/02/2005, 16:53
Avatar de Ruchu  
Fecha de Ingreso: octubre-2001
Mensajes: 698
Antigüedad: 23 años, 3 meses
Puntos: 2
Mithrandir, seguro que son mas pesadas las subconsultas que los inners joins?

Tenia entendido justo lo contrario, que es mas eficiente y menos pesado para el motor hacer subconsultas a inners joins.

Los innersjoins para cada registro de la tabla principal se recorre toda la otra tabla.

Usea, que si la tabla principal tiene 10 registros y la relacionada a ésta 20, el motor recorre la seunga tabla 10*20 veces.=200

En cambio con subconsultas no ocurre esto.

Estoy equivocado?
  #4 (permalink)  
Antiguo 22/02/2005, 18:16
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 8 meses
Puntos: 25
Yo ese es el concepto que yo tenía en un principio, pero los indices hacen que no se recorra toda la tabla en ninguno de los 2 casos.

Eso que menciono lo he verificado en SQL Server mediante los planes de ejecucion de sentencias análogas y el JOIN siempre sale ganando contra el subquery por un escaso margen en el peor de los casos, pero con una buena diferencia en los mejores.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #5 (permalink)  
Antiguo 23/02/2005, 06:06
Avatar de Ruchu  
Fecha de Ingreso: octubre-2001
Mensajes: 698
Antigüedad: 23 años, 3 meses
Puntos: 2
Asi que los indices hacen que no se recorra toda la tabla.

Eso en la tabla principal (con la clave primaria) vale, pero en la relacionada (clave externa), en un principio no hay ningun indice a no ser que lo crees.

Se ha de crear un indice porque sino el inner join si que recorreria toda la tabla?
  #6 (permalink)  
Antiguo 23/02/2005, 06:30
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 5 meses
Puntos: 2
Si una tabla no tiene índice, se la recorrerá entera sea cual sea el tipo de consulta que hagas sobre ella, ya sea con un inner join, con la subconsulta, con un select directo, ...
Un saludo.
__________________
Estoy contagiado de Generación-I
  #7 (permalink)  
Antiguo 24/02/2005, 16:10
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 8 meses
Puntos: 25
Cita:
Iniciado por Vice
Si una tabla no tiene índice, se la recorrerá entera sea cual sea el tipo de consulta que hagas sobre ella, ya sea con un inner join, con la subconsulta, con un select directo, ...
Un saludo.
Exacto. Necesitas tener un índice por la columna con la que haces el join/subquery para que no se haga el Tabla Scan (leer la tabla completa)
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 25/02/2005, 19:43
 
Fecha de Ingreso: febrero-2005
Mensajes: 1.015
Antigüedad: 19 años, 10 meses
Puntos: 6
Cita:
Iniciado por Ruchu
Asi que los indices hacen que no se recorra toda la tabla.

Eso en la tabla principal (con la clave primaria) vale, pero en la relacionada (clave externa), en un principio no hay ningun indice a no ser que lo crees.

Se ha de crear un indice porque sino el inner join si que recorreria toda la tabla?
¿Entonces es así, si no tienes índices da igual JOIN que subconsultas?
  #9 (permalink)  
Antiguo 25/02/2005, 20:59
 
Fecha de Ingreso: febrero-2005
Mensajes: 66
Antigüedad: 19 años, 10 meses
Puntos: 0
Si, pero según Mithrandir (y yo le creo), conviene utilizar JOIN en vez de Subquery, ya que son mas eficientes. Pero tené en cuenta que si no utilizas índices puede bajar la performance, porque lees directamente de la BD, aunque eso dependerá del tamaño de ambas tablas. Yo que vos creo un índice ya que nos es dificil, aunque si definiste la PRIMARY KEY, ese ya es un índice, y si la multiplicación de tablas las haces utilizando ese campo no habría problemas.

Última edición por javier_82; 25/02/2005 a las 21:00
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:59.