首页 > 解决方案 > SQL 在插入查询命令之前从其他表中获取值

问题描述

我想创建一个查询,允许我在将 ID 的名称添加到查询调用的所需表之前查找另一个表中显示的数字。

一个例子:

表格1

ID   |name   |nameID |network |...
----------------------------------
5    |Bob    |4      |NPOW    |...
6    |Billy  |8      |BGER    |...

表2

ID   |name   |nameID |network |...
----------------------------------
3    |Stan   |2      |ERFDT   |...

表3

ID   |name   |nameID |network |...
----------------------------------
3    |Steve  |3      |FRVS    |...

表 4(我在下面插入新行的表)

ID   |name   |nameID |network |...
----------------------------------

在我的页面上,这些是我需要添加到上表 4 中的新

Name   |ID |network |...
------------------------
Nick   |4  |RFGH    |...
Tony   |3  |ESLO    |...
James  |2  |HUII    |...
Rusty  |3  |ERNM    |...

现在我想做的是查看哪个列ID 等于 X并将该名称放入Table4

因此,插入后table4的结果应该如下所示:

ID   |name   |nameFromID |network |...
--------------------------------------
1    |Nick   |Bob        |RFGH    |...
2    |Tony   |Steve      |ESLO    |...
3    |James  |Stan       |HUII    |...
4    |Rusty  |Steve      |ERNM    |...

那么INSERT INTO Table4 查询会是什么样子呢?

标签: sqlsql-servertsqlsql-server-2016

解决方案


您可以使用视图、一些连接和临时表或其他带有会话范围的临时表来执行此操作。这是一个临时表方法。

将所有不同的表带入单个可查询表单的视图:

CREATE VIEW vAllNames
AS
SELECT [Name], NameID FROM Table1 UNION
SELECT [Name], NameID FROM Table2 UNION
SELECT [Name], NameID FROM Table3

以上假设NameId不能在这些表中重复,所以我使用UNIONUNION ALL. 否则,当 id 成功匹配多个表时,您需要告诉我们您希望如何解析名称。您是否希望将多条记录插入到表 4 中,只有第一个匹配项、某种连接等?

临时表,因此我们可以从中选择插入的内容,除非您想一次插入一个(您也可以使用会话范围的持久表或类似的东西来执行此操作):

CREATE TABLE #TempDataToInsert
(
    [Name] NVARCHAR(256),
    ID INT,
    network CHAR(4)
)

创建这些后,您可以将页面中的数据直接插入到TempDataToInsert. 一旦您的数据在那里上演,您就可以运行 final insert into

INSERT INTO Table4
    ([Name], nameFromID, network) -- Assumes ID is an identity column
SELECT
    tempData.[Name], allNames.[Name], tempData.network
FROM
    #TempDataToInsert tempData
    LEFT OUTER JOIN vAllNames allNames ON tempData.ID = allNames.NameID -- assumes no match is still valid for insertions

之后您需要清理临时表,并且我对您的架构做了一些假设,但这应该为您指明正确的方向。


推荐阅读