SQL Server - LEFT JOIN condicional con condiciones en ambos lados
Estoy tratando de hacer una consulta SELECT con uniones condicionales, sin embargo, hay condiciones en ambos lados de la unión, ya que dependiendo de si se cumple una condición, la tabla y las columnas que se unen serán diferentes. Esta es la consulta que estoy intentando:
SELECT per.Name, post.Category
FROM Person per
LEFT JOIN WorkAddress wa ON per.WorkAddressID = wa.ID
LEFT JOIN HomeAddress ha ON per.ID = ha.PersonID
LEFT JOIN Postcode post ON
(CASE WHEN per.WorkAddressID IS NOT NULL THEN wa.PostCodeID ELSE ha.PostCode+ha.Suburb END) =
(CASE WHEN per.WorkAddressID IS NOT NULL THEN post.ID ELSE post.PostcodeSuburb END)
Estos son los datos con los que estoy trabajando:
Código postal:
[ID] INT IDENTITY (1,1) NOT NULL CONSTRAINT [PK_Postcode] PRIMARY KEY,
[Postcode] VARCHAR(4) NOT NULL,
[PostcodeSuburb] VARCHAR(100) NOT NULL,
[Category] INT NOT NULL
+----+----------+----------------+----------+
| ID | Postcode | PostcodeSuburb | Category |
+----+----------+----------------+----------+
| 1 | 1000 | 1000CityA | 1 |
| 2 | 2000 | 2000CityB | 2 |
+----+----------+----------------+----------+
Dirección del trabajo:
[ID] INT IDENTITY (1,1) NOT NULL CONSTRAINT [PK_WorkAddress] PRIMARY KEY,
[Name] VARCHAR(50) NOT NULL,
[Address] VARCHAR(100) NOT NULL,
[PostCodeID] INT NOT NULL CONSTRAINT [FK_WorkAddress_PostCodeID] FOREIGN KEY REFERENCES Postcode(ID)
+----+-----------------+---------------+------------+
| ID | Name | Address | PostcodeID |
+----+-----------------+---------------+------------+
| 1 | CityA Town Hall | 10 Main Road | 1 |
| 2 | CityB Palace | 1 Palace Lane | 2 |
+----+-----------------+---------------+------------+
Persona:
[ID] INT IDENTITY (1,1) NOT NULL CONSTRAINT [PK_Person] PRIMARY KEY,
[Name] VARCHAR(50) NOT NULL,
[WorkAddressID] INT NULL CONSTRAINT [FK_Person_WorkAddressID] FOREIGN KEY REFERENCES WorkAddress(ID)
+----+---------------+---------------+
| ID | Name | WorkAddressID |
+----+---------------+---------------+
| 1 | Johnny Smiles | 1 |
| 2 | Granny Smith | NULL |
| 3 | Smithee Black | 2 |
+----+---------------+---------------+
Dirección de casa:
[ID] INT IDENTITY (1,1) NOT NULL CONSTRAINT [PK_HomeAddress] PRIMARY KEY,
[PersonID] INT NOT NULL CONSTRAINT [FK_HomeAddress_PersonID] FOREIGN KEY REFERENCES Person(ID),
[Address] VARCHAR(100) NOT NULL,
[PostCode] VARCHAR(4) NOT NULL,
[Suburb] VARCHAR(50) NOT NULL
+----+----------+----------------+----------+--------+
| ID | PersonID | Address | PostCode | Suburb |
+----+----------+----------------+----------+--------+
| 1 | 1 | 3 Little Road | 1000 | CityA |
| 2 | 2 | 80 Main Road | 1000 | CityA |
| 3 | 3 | 6 Village Lane | 2000 | CityB |
+----+----------+----------------+----------+--------+
Actualmente recibo un error de Conversion failed when converting the varchar value '2000CityB' to data type int.
Esto es a pesar de que se usa la misma condición en ambas declaraciones CASE. Me pregunto si esto realmente se puede hacer con declaraciones CASE, o si necesito usar un método diferente, ya que las UNIONES condicionales con CASE funcionan si solo un lado tiene una declaración CASE, no ambos.
Y no, preferiría no tener que recurrir a cambiar las estructuras de las tablas por completo.
SQL Fiddle: http://www.sqlfiddle.com/#!18/ 56485/4
Mostrar la mejor respuesta