Inner Join

13/08/2003 - 14:46 por Harrisongs | Informe spam
Hola!

Necesito realizar una comprobacion de un campo clave
sobre varias tablas en las que esta referenciado con
distintas entidades...tal que asi:
Campo clave Id,tabla Persona, necesito saber que existe
en otra tabla llamada Agente y puede ser contenida en dos
campos que no son clave llamados Id_1 e Id_2. Necesito
comprobar tanto que no haya registros duplicados
insertados ni que haya ningun id de Persona sin asignar
en Agente, no se si me he explicado bien...
He realizado comprobaciones en estas tablas usando inner
joins, es la mejor opcion? de que otra manera más eficaz
pudiera realizarlo. Si alguien me pudiera ayudar se lo
agradeceria muchisimo.

Muchas gracias, Un Saludo.
George.

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
13/08/2003 - 15:29 | Informe spam
Hola,
Te mando los datos que usé en las tablas de prueba para que controles si son
los casos que pueden presentarse en tu información, ya que no tengo claro lo
de "registros duplicados insertados", ¿en qué tabla? Asumo que son claves de
#Persona que estén más de una vez en #Agente. Y los que

Saludos... Liliana.

create table #Persona
(id smallint,
nombre char(10))
insert #Persona
select 1, 'Juan' union
select 2, 'Pedro' union
select 3, 'Jose'

create table #Agente
(id_1 smallint,
id_2 smallint)
insert #Agente
select 1, 5 union
select 4, 6 union
select 3, 7 union
select 8, 1

en Agente.
select *
from #Persona
left join #Agente on id = id_1 or id = id_2




"Harrisongs" escribió en el mensaje
news:104301c36198$f054fa10$
Hola!

Necesito realizar una comprobacion de un campo clave
sobre varias tablas en las que esta referenciado con
distintas entidades...tal que asi:
Campo clave Id,tabla Persona, necesito saber que existe
en otra tabla llamada Agente y puede ser contenida en dos
campos que no son clave llamados Id_1 e Id_2. Necesito
comprobar tanto que no haya registros duplicados
insertados ni que haya ningun id de Persona sin asignar
en Agente, no se si me he explicado bien...
He realizado comprobaciones en estas tablas usando inner
joins, es la mejor opcion? de que otra manera más eficaz
pudiera realizarlo. Si alguien me pudiera ayudar se lo
agradeceria muchisimo.

Muchas gracias, Un Saludo.
George.
Respuesta Responder a este mensaje
#2 Emilio Boucau
13/08/2003 - 17:57 | Informe spam
Liliana,

creo que seria mejor si lo hace asi, no ? Es solo para reducir la cantidad
de filas obtenidas ... Obtendra de P los que no esten en A.

en Agente.
select P.*
from #Persona AS P
left join #Agente AS A
on P.id = A.id_1 or P.id = A.id_2
where (A.id_1 IS NULL) OR (A.id_2 IS NULL)

Saludos !

Emilio Boucau
Microsoft MVP SQL Server
http://www.portalsql.com
PASS Spanish Group
http://www.sqlpass.org

Buenos Aires - Argentina
Respuesta Responder a este mensaje
#3 Javier Loria\(MVP\)
13/08/2003 - 19:39 | Informe spam
Hola:
Esto de SQL es una maravilla: una pregunta y 3 respuestas diferentes!.
Se parece a un chiste que contaba mi papa sobre los economistas, 1 hecho, 3
economistas y 4 opiniones diferentes.
Aqui esta mi aporte para embarrar un poco mas la cancha, basado en el
ejemplo de Liliana:
/* Creacion de Tablas e */
/* Ingreso de Filas */
CREATE TABLE #Personas(
Id SMALLINT NOT NULL PRIMARY KEY,
Nombre CHAR(10) NOT NULL)

INSERT #Personas
SELECT 1, 'Liliana' UNION
SELECT 2, 'Emilio' UNION
SELECT 3, 'Javier'
despues y yo de ultimo :)

CREATE TABLE #Agentes(
Id_1 SMALLINT NOT NULL,
Id_2 SMALLINT NOT NULL)

INSERT #Agentes
SELECT 1, 3 union
SELECT 3, 6
/* Fin de Creacion de Tablas e */
/* Ingreso de Fila */
Tenemos 2 consultas:
1) Hay una Persona NO este registrada:
/* Codigo de Emilio */
/* Modificado */
SELECT P.Id,
P.Nombre
FROM #Personas AS P LEFT JOIN #Agentes AS A
ON P.Id= A.Id_1 or P.id = A.Id_2
WHERE (A.id_1 IS NULL)
/* Modificado */
Hey!!! donde esta Emilio?, se esta perdiendo las Quilmes!!!. Y la condicion
de A.Id_2 IS NULL es redundante,
2) No hay una persona registrada 2 veces:
/* Codigo de Javier :) */
/* Ya era hora que aportara algo y dejara de corregir, */
/* codigo ajeno con necesades como PK y NOT NULL :) */
/* Codigo de Javier :) */
/* Ya era hora que aportara algo y dejara de corregir, */
/* el codigo ajeno con necesades como PK y NOT NULL :) */
SELECT P.Id,
p.Nombre
FROM #Personas AS P JOIN
( SELECT #Agentes.Id_1 AS Id
FROM #Agentes
UNION ALL
SELECT #Agentes.Id_2
FROM #Agentes
) AS A
ON
P.Id= A.Id
GROUP BY P.Id, P.Nombre
HAVING COUNT(*)>1
Hey Javier se esta tomando las Quilmes de Emilio!!!.

Una ultima consulta, no pediste (o por lo menos eso me parece) es que
exista alguien registrado como Agente que no sea persona:
/* Inicio de Codigo */
SELECT A.Id,
'?' AS Nombre
FROM #Personas AS P
RIGHT JOIN
( SELECT #Agentes.Id_1 AS Id
FROM #Agentes
UNION
SELECT #Agentes.Id_2
FROM #Agentes
) AS A
ON
P.Id= A.Id
WHERE P.Id IS NULL

Como quien dice: QUIEN P es 6?

Mis comentarios de cierre:
a) Espero que esto sea codigo de limpieza, de esos que se corre una vez
para migrar y punto, porque este codigo FEO Y LENTO como para quedarse en
produccion.
b) Si estas cambiando la BD, considera la posiblidad de mantener la
relacion entre Agentes y Personas en una tabla AgentesPersonas asi es muy
facil por integridad declarativa controlar las reglas anteriores.

Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Harrisongs escribio:
Hola!

Necesito realizar una comprobacion de un campo clave
sobre varias tablas en las que esta referenciado con
distintas entidades...tal que asi:
Campo clave Id,tabla Persona, necesito saber que existe
en otra tabla llamada Agente y puede ser contenida en dos
campos que no son clave llamados Id_1 e Id_2. Necesito
comprobar tanto que no haya registros duplicados
insertados ni que haya ningun id de Persona sin asignar
en Agente, no se si me he explicado bien...
He realizado comprobaciones en estas tablas usando inner
joins, es la mejor opcion? de que otra manera más eficaz
pudiera realizarlo. Si alguien me pudiera ayudar se lo
agradeceria muchisimo.

Muchas gracias, Un Saludo.
George.
Respuesta Responder a este mensaje
#4 Liliana Sorrentino
13/08/2003 - 20:56 | Informe spam
Javier:
No sé si a Harrisongs lo ayudamos o quedó más perdido que antes, pero lo
bueno es que además de trabajar nos divertimos. Y eso es genial, me reí
mucho con tus comentarios.

Saludos... Liliana.

"Javier Loria(MVP)" escribió en el mensaje
news:
Hola:
Esto de SQL es una maravilla: una pregunta y 3 respuestas diferentes!.
Se parece a un chiste que contaba mi papa sobre los economistas, 1 hecho,


3
economistas y 4 opiniones diferentes.
Aqui esta mi aporte para embarrar un poco mas la cancha, basado en el
ejemplo de Liliana:
/* Creacion de Tablas e */
/* Ingreso de Filas */
CREATE TABLE #Personas(
Id SMALLINT NOT NULL PRIMARY KEY,
Nombre CHAR(10) NOT NULL)

INSERT #Personas
SELECT 1, 'Liliana' UNION
SELECT 2, 'Emilio' UNION
SELECT 3, 'Javier'


Emilio
despues y yo de ultimo :)

CREATE TABLE #Agentes(
Id_1 SMALLINT NOT NULL,
Id_2 SMALLINT NOT NULL)

INSERT #Agentes
SELECT 1, 3 union
SELECT 3, 6
/* Fin de Creacion de Tablas e */
/* Ingreso de Fila */
Tenemos 2 consultas:
1) Hay una Persona NO este registrada:
/* Codigo de Emilio */
/* Modificado */
SELECT P.Id,
P.Nombre
FROM #Personas AS P LEFT JOIN #Agentes AS A
ON P.Id= A.Id_1 or P.id = A.Id_2
WHERE (A.id_1 IS NULL)
/* Modificado */
Hey!!! donde esta Emilio?, se esta perdiendo las Quilmes!!!. Y la


condicion
de A.Id_2 IS NULL es redundante,
2) No hay una persona registrada 2 veces:
/* Codigo de Javier :) */
/* Ya era hora que aportara algo y dejara de corregir, */
/* codigo ajeno con necesades como PK y NOT NULL :) */
/* Codigo de Javier :) */
/* Ya era hora que aportara algo y dejara de corregir, */
/* el codigo ajeno con necesades como PK y NOT NULL :) */
SELECT P.Id,
p.Nombre
FROM #Personas AS P JOIN
( SELECT #Agentes.Id_1 AS Id
FROM #Agentes
UNION ALL
SELECT #Agentes.Id_2
FROM #Agentes
) AS A
ON
P.Id= A.Id
GROUP BY P.Id, P.Nombre
HAVING COUNT(*)>1
Hey Javier se esta tomando las Quilmes de Emilio!!!.

Una ultima consulta, no pediste (o por lo menos eso me parece) es que
exista alguien registrado como Agente que no sea persona:
/* Inicio de Codigo */
SELECT A.Id,
'?' AS Nombre
FROM #Personas AS P
RIGHT JOIN
( SELECT #Agentes.Id_1 AS Id
FROM #Agentes
UNION
SELECT #Agentes.Id_2
FROM #Agentes
) AS A
ON
P.Id= A.Id
WHERE P.Id IS NULL

Como quien dice: QUIEN P es 6?

Mis comentarios de cierre:
a) Espero que esto sea codigo de limpieza, de esos que se corre una


vez
para migrar y punto, porque este codigo FEO Y LENTO como para quedarse en
produccion.
b) Si estas cambiando la BD, considera la posiblidad de mantener la
relacion entre Agentes y Personas en una tabla AgentesPersonas asi es muy
facil por integridad declarativa controlar las reglas anteriores.

Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Harrisongs escribio:
> Hola!
>
> Necesito realizar una comprobacion de un campo clave
> sobre varias tablas en las que esta referenciado con
> distintas entidades...tal que asi:
> Campo clave Id,tabla Persona, necesito saber que existe
> en otra tabla llamada Agente y puede ser contenida en dos
> campos que no son clave llamados Id_1 e Id_2. Necesito
> comprobar tanto que no haya registros duplicados
> insertados ni que haya ningun id de Persona sin asignar
> en Agente, no se si me he explicado bien...
> He realizado comprobaciones en estas tablas usando inner
> joins, es la mejor opcion? de que otra manera más eficaz
> pudiera realizarlo. Si alguien me pudiera ayudar se lo
> agradeceria muchisimo.
>
> Muchas gracias, Un Saludo.
> George.


Respuesta Responder a este mensaje
#5 Harrisongs
14/08/2003 - 11:40 | Informe spam
Muchas Gracias a Todos!! todavia no he tenido tiempo de
leer todas las opciones que me disteis, pero espero
hacerlo a la vuelta, porque ahora me voy a almorzar! que
todavia no lo hice!

Un saludo muy cordial para todos!
HArrisonGs


Hola!

Necesito realizar una comprobacion de un campo clave
sobre varias tablas en las que esta referenciado con
distintas entidades...tal que asi:
Campo clave Id,tabla Persona, necesito saber que existe
en otra tabla llamada Agente y puede ser contenida en


dos
campos que no son clave llamados Id_1 e Id_2. Necesito
comprobar tanto que no haya registros duplicados
insertados ni que haya ningun id de Persona sin asignar
en Agente, no se si me he explicado bien...
He realizado comprobaciones en estas tablas usando inner
joins, es la mejor opcion? de que otra manera más eficaz
pudiera realizarlo. Si alguien me pudiera ayudar se lo
agradeceria muchisimo.

Muchas gracias, Un Salu=ES&
George.
.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida