Select

17/10/2003 - 10:31 por Rodrigo Corral González | Informe spam
Dada la siguiente estructura de tablas:

DROP TABLE #Personas
DROP TABLE #Direcciones

CREATE TABLE [#Personas] (
[IdPersona] [int] IDENTITY (1, 1) NOT NULL ,
[Nombre] [nvarchar] (50) NOT NULL ,
) ON [PRIMARY]
GO

CREATE TABLE [#Direcciones] (
[IdTipoDir] [int] NOT NULL , --1 primaria 2 secundaria
[IdPersona] [int] NOT NULL ,
[Direccion] [nvarchar] (50)
) ON [PRIMARY]
GO

INSERT #Personas (Nombre) VALUES ('Rodrigo') --Solo dirección primaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (1, 1,
'Dirección primaria Rodrigo')

INSERT #Personas (Nombre) VALUES ('Javier') --Solo secundaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (2, 2,
'Dirección secundaria Javier')

INSERT #Personas (Nombre) VALUES ('Antonio') --Primaria y secundaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (3, 1,
'Dirección primaria Antonio')
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (3, 2,
'Dirección secundaria Antonio')

Neceisto la select que me devuelva los datos de una persona y su dirección,
de manera que si una persona tiene dirección secundaria sea esta la que se
devuelva y si no tiene secundaria se devuelva la primaria. Para los datos
del ejemplo:

IdPersona Nombre IdTipoDir
IdPersona Direccion
-
1 Rodrigo 1
1 Dirección primaria Rodrigo
2 Javier 2
2 Dirección secundaria Javier
3 Antonio 2
3 Dirección secundaria Antonio

Gracias de antemano por su ayuda
Un saludo
Rodrigo Corral González

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
17/10/2003 - 13:31 | Informe spam
Hola Rodrigo,
antes que nada, gracias por facilitarnos toda la información necesaria para
ayudarte.
Acá mi sugerencia.
Saludos... Liliana.

SELECT P.IdPersona, Nombre, ISNULL(DS.IdTipoDir, DP.IdTipoDir),
ISNULL(DS.IdPersona, DP.IdPersona), ISNULL(DS.Direccion, DP.Direccion)
FROM #Personas P
LEFT JOIN #Direcciones DP ON P.IdPersona = DP.IdPersona AND DP.IdTipoDir = 1
LEFT JOIN #Direcciones DS ON P.IdPersona = DS.IdPersona AND DS.IdTipoDir = 2

"Rodrigo Corral González" escribió en el mensaje
news:
Dada la siguiente estructura de tablas:

DROP TABLE #Personas
DROP TABLE #Direcciones

CREATE TABLE [#Personas] (
[IdPersona] [int] IDENTITY (1, 1) NOT NULL ,
[Nombre] [nvarchar] (50) NOT NULL ,
) ON [PRIMARY]
GO

CREATE TABLE [#Direcciones] (
[IdTipoDir] [int] NOT NULL , --1 primaria 2 secundaria
[IdPersona] [int] NOT NULL ,
[Direccion] [nvarchar] (50)
) ON [PRIMARY]
GO

INSERT #Personas (Nombre) VALUES ('Rodrigo') --Solo dirección primaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (1, 1,
'Dirección primaria Rodrigo')

INSERT #Personas (Nombre) VALUES ('Javier') --Solo secundaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (2, 2,
'Dirección secundaria Javier')

INSERT #Personas (Nombre) VALUES ('Antonio') --Primaria y secundaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (3, 1,
'Dirección primaria Antonio')
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (3, 2,
'Dirección secundaria Antonio')

Neceisto la select que me devuelva los datos de una persona y su


dirección,
de manera que si una persona tiene dirección secundaria sea esta la que se
devuelva y si no tiene secundaria se devuelva la primaria. Para los datos
del ejemplo:

IdPersona Nombre IdTipoDir
IdPersona Direccion
-
1 Rodrigo 1
1 Dirección primaria Rodrigo
2 Javier 2
2 Dirección secundaria Javier
3 Antonio 2
3 Dirección secundaria Antonio

Gracias de antemano por su ayuda
Un saludo
Rodrigo Corral González


Respuesta Responder a este mensaje
#2 Javier Loria
17/10/2003 - 17:46 | Informe spam
Hola Rodrigo:
Te reitero el agradecimiento de Liliana de proveernos toda la
informacion para ayudarte. Una parte del los requerimientos que me deja duda
es que pasa si la persona no tiene direccion.
En este caso tienes 3 alternativas: Que aparezcan en NULL las columnas
relacionadas con la Direccion, que No aparezcan las personas sin direccion,
o que aparezcan con algun valor predeterminadao.
a) El SELECT de Liliana usa la primera opcion.
b) Para la segunda debes agregar un WHERE. No toques el LEFT JOIN,
porque lo descompones, ya yo lo hice :) mejor agrega:
/* Condicion */
WHERE NOT ( (DP.IdPersona IS NULL)
AND (DS.IdPersona IS NULL))
/* Condicion */
c) Cambia el SELECT de Lilliana y usa COALESCE (que de por si es ANSI y
es mas general que ISNULL):
/* Codigo de Liliana */
/* Adaptado con COALESCE */
SELECT P.IdPersona,
Nombre,
COALESCE(DP.IdTipoDir,
DS.IdTipoDir,
0) AS IdTipoDir,
COALESCE(DP.Direccion,
DS.Direccion,
'*** Desconocida***')
AS Direccion
FROM #Personas P
LEFT JOIN #Direcciones DP ON P.IdPersona = DP.IdPersona AND DP.IdTipoDir = 1
LEFT JOIN #Direcciones DS ON P.IdPersona = DS.IdPersona AND DS.IdTipoDir = 2
/ * Fin de Codigo */

Saludos,

Javier Loria
Costa Rica
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.
Liliana Sorrentino escribio:
Hola Rodrigo,
antes que nada, gracias por facilitarnos toda la información
necesaria para ayudarte.
Acá mi sugerencia.
Saludos... Liliana.

SELECT P.IdPersona, Nombre, ISNULL(DS.IdTipoDir, DP.IdTipoDir),
ISNULL(DS.IdPersona, DP.IdPersona), ISNULL(DS.Direccion, DP.Direccion)
FROM #Personas P
LEFT JOIN #Direcciones DP ON P.IdPersona = DP.IdPersona AND
DP.IdTipoDir = 1 LEFT JOIN #Direcciones DS ON P.IdPersona > DS.IdPersona AND DS.IdTipoDir = 2

"Rodrigo Corral González" escribió en el
mensaje news:
Dada la siguiente estructura de tablas:

DROP TABLE #Personas
DROP TABLE #Direcciones

CREATE TABLE [#Personas] (
[IdPersona] [int] IDENTITY (1, 1) NOT NULL ,
[Nombre] [nvarchar] (50) NOT NULL ,
) ON [PRIMARY]
GO

CREATE TABLE [#Direcciones] (
[IdTipoDir] [int] NOT NULL , --1 primaria 2 secundaria
[IdPersona] [int] NOT NULL ,
[Direccion] [nvarchar] (50)
) ON [PRIMARY]
GO

INSERT #Personas (Nombre) VALUES ('Rodrigo') --Solo dirección
primaria INSERT #Direcciones (IdPersona, IdTipoDir, Direccion)
VALUES (1, 1, 'Dirección primaria Rodrigo')

INSERT #Personas (Nombre) VALUES ('Javier') --Solo secundaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (2, 2,
'Dirección secundaria Javier')

INSERT #Personas (Nombre) VALUES ('Antonio') --Primaria y secundaria
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (3, 1,
'Dirección primaria Antonio')
INSERT #Direcciones (IdPersona, IdTipoDir, Direccion) VALUES (3, 2,
'Dirección secundaria Antonio')

Neceisto la select que me devuelva los datos de una persona y su
dirección, de manera que si una persona tiene dirección secundaria
sea esta la que se devuelva y si no tiene secundaria se devuelva la
primaria. Para los datos del ejemplo:

IdPersona Nombre IdTipoDir
IdPersona Direccion
-
1 Rodrigo 1
1 Dirección primaria Rodrigo
2 Javier 2
2 Dirección secundaria Javier
3 Antonio 2
3 Dirección secundaria Antonio

Gracias de antemano por su ayuda
Un saludo
Rodrigo Corral González
Respuesta Responder a este mensaje
#3 Rodrigo Corral González
17/10/2003 - 19:00 | Informe spam
No puede darse el caso de que no aparezcan personas sin dirección.

Javier el motivo de poner el script para recrear un ejemplo fue tu autofirma
:)

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