我试图创建一个视图,该视图根据与要连接的值关联的列提供不同的表。
示例:
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
如果要加入该视图的ID为类型1,则视图选择表A。如果ID为2,则选择表B。
ID 123的预期结果将是:
+-----+------------+
| ID | LocationID |
+-----+------------+
| 123 | 7 |
+-----+------------+
ID 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
问题在于,将参数传递给这样的函数将需要对应用程序进行更改。我希望不必实施这些更改,因此,如果我可以使用视图或不需要参数的函数重新创建上例中的功能,则将是理想的选择。有什么想法吗?
答案 0 :(得分:2)
为什么不为所有三个表创建视图?
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
才能获得正确的表,因此似乎应该将所有三个表一起使用。
答案 1 :(得分:0)
您无法将参数发送到VIEW中,因此无法根据select查询的内容使它执行其他操作。
您可以做的是,假设表A和表B具有相同的列,然后使用UNION查询,然后在WHERE子句中使用“类型”列