添加计算列以检查值是不是在另一个表中
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之前检查表中的行中的值是不是已经存在