Присоединиться к различным таблицам в зависимости от столбца, связанного со значением, к которому присоединяется? - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь создать представление, которое предоставляет разные таблицы в зависимости от столбца, связанного со значением, к которому присоединяется.

Пример:

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

Проблема в том, что передача параметра в функцию, подобную этой, потребует внесения изменений в приложение. Я бы предпочел не вносить эти изменения, поэтому было бы идеально, если бы я мог воссоздать функциональность в приведенном выше примере либо с представлением, либо с функцией, которая не требует параметра. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Почему бы не создать представление для всех трех таблиц?

select t.id, coalesce(a.locationid, b.locationid) as locationid
from sometable t left join
     a
     on t.id = a.id and t.type = 1 left join
     b
     on t.id = b.id and t.type = 2;

Вам нужно type, чтобы получить правильную таблицу, поэтому кажется, что все три таблицы должны использоваться вместе.

0 голосов
/ 26 июня 2019

Вы не можете отправить параметр в VIEW, поэтому невозможно заставить его делать разные вещи в зависимости от содержимого запроса select.

Что вы можете сделать, это использоватьЗапрос UNION, предполагая, что таблицы A и таблица B имеют одинаковые столбцы, затем используйте столбец Type в предложении WHERE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...