sql - 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 查询会是什么样子呢?
解决方案
您可以使用视图、一些连接和临时表或其他带有会话范围的临时表来执行此操作。这是一个临时表方法。
将所有不同的表带入单个可查询表单的视图:
CREATE VIEW vAllNames
AS
SELECT [Name], NameID FROM Table1 UNION
SELECT [Name], NameID FROM Table2 UNION
SELECT [Name], NameID FROM Table3
以上假设NameId
不能在这些表中重复,所以我使用UNION
了UNION 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
之后您需要清理临时表,并且我对您的架构做了一些假设,但这应该为您指明正确的方向。
推荐阅读
- excel - 复制大于零的单元格,并将值粘贴到同一单元格中
- amp-html - 如何避免 AMP 网站上的重复代码?
- python - 抓取多个网页,结果输出乱序
- c - 基于计数排序的问题中的 SIGSEGV 错误
- xcode - 自定义字体未显示在我的开发窗格中
- python - tcp server 结合 Python3.7 asyncio 和 multiprocess
- amazon-web-services - 安全组和网络接口出现 AWS CloudFormation 错误,参数组合无效
- sql-server - 结合表数据和历史表
- c# - 使用多租户缓存用户数据
- java - 如何在一段时间内拒绝对方法的访问?