Principales respuestas
Como realizar un inner join entre varias tablas

Pregunta
-
Tengo una tabla de registros… Esta tabla de registros tiene asociado un foreign key a una tabla llamada Regiones y asu vez regiones tiene un foreign key a una tabla estados… Algo asi…
CREATE TABLE Estados(
EstadoId INT PRIMARY KEY,
Estado VARCHAR(50))
CREATE TABLE Regiones(
RegionId INT PRIMARY KEY,
Region VARCHAR(50),
EstadoId INT FOREIGN KEY REFERENCES Estados (EstadoId))
CREATE TABLE Registros(
RegistroId INT PRIMARY KEY IDENTITY (1, 1),
RegionId INT FOREIGN KEY REFERENCES Regiones (RegionId))
Un estado obviamente puede tener N regions. Ahora necesito hacer un query que me traiga todos los datos de la tabla Registros y su Estado.
La siguiente data en Tabla Estados
INSERT INTO Estados (EstadoId, Estado) VALUES (1, 'Estado1'), (2, 'Estado2'), (4, 'Estado3'), (8, 'Estado4'), (11, 'Estado5')
La siguiente data e Tabla Regiones
INSERT INTO Regiones (RegionId, Region, EstadoId) VALUES
(1, 'Region1', 1), (2, 'Region2', 2), (3, 'Region3', 1), (4, 'Region4', 1), (5, 'Region5', 4), (8, 'Region6', 8), (9, 'Region7', 11)
Tengo la siguiente data en tabla Registros
INSERT INTO Registros (RegionId) VALUES
(1), (2), (2), (2), (2),
(2), (2), (3), (3), (4),
(4), (4), (5), (8), (8),
(8), (8), (8), (8), (9)
Tengo los siguientes query…
SELECT pub.RegistroId, RegionId FROM Registros pub
SELECT pub.RegistroId, est.Estado FROM Registros pub INNER JOIN Regiones rg ON rg.EstadoId = pub.RegionId INNER JOIN Estados est ON est.EstadoId = rg.EstadoId
El primero de ellos me trae todos los registros que hay los cuales son 20, mientras que el segundo me esta trayendo mal la data, en lugar de traerme 20 registros me trae 18 y aparte de 18 me trae registros repetidos…
En el caso de los registros con la región 1 me los trae 3 veces esto se debe a que en la tabla Region hay 3 regiones que tienen un mismo EstadoId asociado. Mientras que lo que tienen el RegonID = 8 ni me los trae.
Que estoy haciendo mal?
Respuestas
-
Hola.
Así a primera vista, estás cruzando Registros y Regiones por el campo que no es. Prueba así:
SELECT pub.RegistroId, est.Estado FROM Registros pub INNER JOIN Regiones rg ON rg.RegionId = pub.RegionId INNER JOIN Estados est ON est.EstadoId = rg.EstadoId
Si no es eso, nos dices.
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator lunes, 6 de junio de 2011 20:43
- Marcado como respuesta Eduardo PorteschellerModerator miércoles, 8 de junio de 2011 17:10
Todas las respuestas
-
Hola.
Así a primera vista, estás cruzando Registros y Regiones por el campo que no es. Prueba así:
SELECT pub.RegistroId, est.Estado FROM Registros pub INNER JOIN Regiones rg ON rg.RegionId = pub.RegionId INNER JOIN Estados est ON est.EstadoId = rg.EstadoId
Si no es eso, nos dices.
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator lunes, 6 de junio de 2011 20:43
- Marcado como respuesta Eduardo PorteschellerModerator miércoles, 8 de junio de 2011 17:10
-
Hola.
Así a primera vista, estás cruzando Registros y Regiones por el campo que no es. Prueba así:
SELECT pub.RegistroId, est.Estado FROM Registros pub INNER JOIN Regiones rg ON rg.RegionId = pub.RegionId INNER JOIN Estados est ON est.EstadoId = rg.EstadoId
Si no es eso, nos dices.
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande