Я пытаюсь создать представление, которое предоставляет разные таблицы в зависимости от столбца, связанного со значением, к которому присоединяется.
Пример:
SomeTable
+-----+------+
| ID | Type |
+-----+------+
| 123 | 1 |
| 124 | 2 |
| 125 | 1 |
| 126 | 2 |
+-----+------+
TableA
+---------+---------------+-----+------------+
| Item_ID | Serial_Number | ID | LocationID |
+---------+---------------+-----+------------+
| 1 | 19-001 | 124 | 4 |
| 2 | 19-002 | 126 | 17 |
+---------+---------------+-----+------------+
TableB
+-----+------------+----------+
| ID | LocationID | Quantity |
+-----+------------+----------+
| 123 | 7 | 15 |
| 125 | 12 | 10 |
+-----+------------+----------+
SELECT t.ID, v.LocationID
FROM SomeTable t
FULL JOIN NewView v ON t.ID = v.ID
WHERE t.ID = 123
Если идентификатор, к которому присоединяется представление, относится к типу 1, тогда в представлении выбирается таблица A. Если идентификатор относится к типу 2, то выберите таблицу B.
Ожидаемый результат для идентификатора 123 будет:
+-----+------------+
| ID | LocationID |
+-----+------------+
| 123 | 7 |
+-----+------------+
И ожидаемый результат для идентификатора 124 будет:
+-----+------------+
| ID | LocationID |
+-----+------------+
| 124 | 4 |
+-----+------------+
Я знаю, что мог бы сделать это, используя функцию и передав параметр следующим образом:
SELECT t.ID, f.LocationID
FROM SomeTable t
FULL JOIN NewFunction(123) f ON t.ID = f.ID
WHERE t.ID = 123
А вот и функция:
CREATE FUNCTION NewFunction (@ID)
RETURNS @ReturnTable TABLE (ID INT, LocationID INT)
BEGIN
DECLARE @Type INT
SET @Type = (SELECT Type FROM SomeTable WHERE ID = @ID)
IF @Type = 1
INSERT INTO @ReturnTable (ID, LocationID)
SELECT t.ID, a.LocationID
FROM SomeTable t
FULL JOIN TableA a
WHERE t.ID = @ID
ELSE
INSERT INTO @ReturnTable (ID, LocationID)
SELECT t.ID, b.LocationID
FROM SomeTable t
FULL JOIN TableB b
WHERE t.ID = @ID
RETURN
END
Проблема в том, что передача параметра в функцию, подобную этой, потребует внесения изменений в приложение. Я бы предпочел не вносить эти изменения, поэтому было бы идеально, если бы я мог воссоздать функциональность в приведенном выше примере либо с представлением, либо с функцией, которая не требует параметра. Есть идеи?