Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据与要联接的值关联的列,在不同的表上联接?_Sql_Tsql - Fatal编程技术网

Sql 根据与要联接的值关联的列,在不同的表上联接?

Sql 根据与要联接的值关联的列,在不同的表上联接?,sql,tsql,Sql,Tsql,我试图创建一个视图,该视图根据与所联接的值关联的列提供不同的表 例如: SomeTable +-----+------+ | ID | Type | +-----+------+ | 123 | 1 | | 124 | 2 | | 125 | 1 | | 126 | 2 | +-----+------+ TableA +---------+---------------+-----+------------+ | Item_ID | Serial_Number | I

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

例如:

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  | LocationID |
+-----+------------+
| 124 |          4 |
+-----+------------+
ID 124的预期结果是:

+-----+------------+
| ID  | LocationID |
+-----+------------+
| 123 |          7 |
+-----+------------+
+-----+------------+
| 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

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

您不能将参数发送到视图中,因此无法根据select查询的内容使其执行不同的操作


您可以做的是使用联合查询,假设表a和表B具有相同的列,然后使用WHERE子句中的Type列,为什么不为所有三个表创建一个视图呢

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;

您需要
类型
来获得正确的表,因此似乎所有三个表都应该一起使用。

为我们展示相关表的一些示例表数据。以及预期结果。一个视图可以连接多个表,并将结果合并为来自一个表的结果,例如,通过使用外部连接和
合并
,将不同表中的家庭、工作和移动电话号码合并为一列。视图所不能做的是通过以太来识别它所处的环境,并基于此改变其行为:“好吧,如果您要在我的
ShoeWidth
列上加入一个Unicode列,那么我将返回…”您可以将视图嵌套在包含附加逻辑的更大视图中,但我不认为这是你想要的。所以事实上,我认为像这样的事情可能会奏效。我认为仅仅从表a和表B中提出一个观点就能得到我想要的结果。这与其说是一个答案,不如说是一个评论