根据与要连接的值相关联的列在不同的表上进行连接?

时间:2019-06-26 13:32:52

标签: sql tsql

我试图创建一个视图,该视图根据与要连接的值关联的列提供不同的表。

示例:

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

问题在于,将参数传递给这样的函数将需要对应用程序进行更改。我希望不必实施这些更改,因此,如果我可以使用视图或不需要参数的函数重新创建上例中的功能,则将是理想的选择。有什么想法吗?

2 个答案:

答案 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子句中使用“类型”列