添加计算列以检查值是不是在另一个表中

Posted

技术标签:

【中文标题】添加计算列以检查值是不是在另一个表中【英文标题】:Adding Computed Column to check if the value is in another table添加计算列以检查值是否在另一个表中 【发布时间】:2015-11-05 06:37:29 【问题描述】:

我有两张桌子

表1

 ID . Name . Position  
= = = = = = = = = = = =  
10 . Mike . Analyst  
20 . Anna . HR  
30 . Mark . Accountant 

表2

 Deal ID . Status  
= = = = = = = = = = = =  
10 . . . . .  Active  
19 . . . . . New  
20 . . . . . New  

我想用这个逻辑在 Table1 中添加一个新的计算列

如果在 Table2 中找到 ID,则返回 Position,否则返回“NONE” 所以输出表应该是这样的

输出

ID . Name . Position . . . . **NewCol**  
= = = = = = = = = = = = = = = = =  
10 . Mike . Analyst . . . . . **Analyst**  
20 . Anna . HR . . . . . . . . **HR**  
30 . Mark . Accountant. . **NONE**  

【问题讨论】:

SO上有这么多可用的解决方案? Retrieving the last record in each group的可能重复 我试过这个 ALTER TABLE Table1 ADD newcolumn AS Case When Table1.ID in Table2.Deal ID then Table1.position else 'None' end - 但它不起作用 对不起,我是 SQL 编码的新手——任何答案都会有所帮助。 SO是什么? 我不确定您是否可以使用生成的列完成您需要的操作,请参阅 13.1.14 CREATE TABLE Syntax 中的 Generated column expressions must adhere to the following rules.。一种选择是使用基列(非生成)和触发器。 【参考方案1】:

有两种方法可以做到这一点。

基于查询的结果

如果您只想在每次需要时显示信息,最简单、最干净、最有效的方法就是在表中执行 SELECT。此外,数据将始终更新,因为查询运行在实际表状态。

因此,查询将如下所示:

SELECT T1.*, IF(T2.ID IS NULL, 'NONE', T1.Position) As NewPos
FROM Table1 T1 LEFT OUTER JOIN Table2 T2
ON (T1.ID = T2.ID)

如果在 Table2 上找到,此查询将显示该位置,如果没有,它将显示 NULL 值,因此它可能对您的需求有用。


数据库修改和数据插入

另一种方法是改变 Table1 结构以添加列位置。列的存在是指表架构,它不依赖于值,因此您不能更改表并根据行值添加列。

所以,第一步要做的是改变表格添加列,如下所示:

ALTER TABLE table1 ADD COLUMN Position VARCHAR(50);

第二步是填充数据。为此,您必须执行 UPDATE 以填充您刚刚创建的数据,如下所示。

UPDATE Table1 T1 LEFT OUTER JOIN Table2 T2
ON (T1.ID = T2.ID)
SET T1.Position = IF(T2.ID IS NULL, 'NONE', T1.Position);

此查询将更新ID引用的Table2中也存在的行并放置其位置。

这种方式的问题是,如果你执行这个和之后,你向Table1和Table2添加行,信息将不会更新,你必须每隔一定时间做一次UPDATE查询,即数据库和时间成本。

所以,如果应用程序不是太大,在这种情况下最好只使用 SELECT 查询,这涉及更少的成本、性能和数据库更改。

【讨论】:

感谢您抽出宝贵时间,但这个答案不会给我上面所需的输出表,我已经用示例更新了我的问题。 嗨@MagedZaki,我已经更新了答案。现在,它显示的是“NONE”字符串,而不是 NULL。它对你有用吗? 一个计算列被添加到表中,每当获取记录时都会再次计算或保留其值,这意味着它将计算一次。问题是如何添加该特定列。您的查询返回多个值,并且您的更新不符合 computed column 的定义

以上是关于添加计算列以检查值是不是在另一个表中的主要内容,如果未能解决你的问题,请参考以下文章

EF Core:检查 OnModelCreating 中是不是存在列以忽略属性

添加每个客户的旧购买列以进行比较

如何编写一个触发器来检查一个值是不是已经在表中?

在添加Flask,SQLAlchemy之前检查表中的行中的值是不是已经存在

如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)

AWS DMS 添加新列以跟踪更改