很抱歉,如果这是一个基本问题。我对SQL很新,所以我想我只是缺少要搜索的概念的名称。
快速概述。
第一张表(项目):
ID | name
-------------
1 | abc
2 | def
3 | ghi
4 | jkl
第二张表(对):
ID | FirstMember | SecondMember Virtual column (pair name)
-------------------------------------
1 | 2 | 3 defghi
2 | 1 | 4 abcjkl
我正在尝试构建第二个表中显示的虚拟列 它可以在第二个表中的任何条目时构建,但如果以这种方式完成,那么任何时候重命名第一个表中的一个项目时,该列中的数据都会出错。
我也理解我可以在任何需要的时候构建该列(在普通请求或存储过程中),但这会导致代码重复,因为第二个表可能涉及多个不同的请求。
那么有没有办法定义一个“虚拟”列,可以作为普通列访问,但其内容是动态构建的?
感谢。
编辑:这是在MsSql 2008上,但首选的是与引擎无关的解决方案。
编辑:上面的示例以多种方式过度简化 - 主要的一点是虚拟列内容不是两个名称的直接串联,而是更复杂的,取决于我没有描述的列的内容。尽管如此,你提供了多条似乎很有希望的路径 - 我会回来的。感谢。
答案 0 :(得分:3)
您需要两次加入项目表:
select p.id,
p.firstMember,
p.secondMember,
i1.name||i2.name as pair_name
from pairs as p
join items as i1 on p.FirstMember = i1.id
join items as i2 on p.SecondMember = i2.id;
然后将其放入视图中,您就拥有了#34;虚拟列"。您只需在pairs
列的任何位置查询视图而不是实际的pair_name
表。
请注意,如果你的" FirstMember"和" SecondMember"列可能为null,您可能希望使用外部联接。
答案 1 :(得分:1)
您可以使用view,它会根据查询结果创建一个类似于表的对象,例如提供了a_horse_with_no_name的对象。
CREATE VIEW pair_names AS
SELECT p.id,
p.firstMember,
p.secondMember,
CONCAT(i1.name, i2.name) AS pair_name
FROM pairs AS p
JOIN items AS i1 ON p.FirstMember = i1.id
JOIN items AS i2 ON p.SecondMember = i2.id;
然后查询结果:
SELECT id, pair_name FROM pair_names;
答案 2 :(得分:0)
如果您愿意,可以为“虚拟列”创建一个视图,如下所示:
CREATE VIEW aView AS
SELECT
p.ID,
p.FirstMember,
p.SecondMember,
a.name + b.name as 'PairName'
FROM
pairs p
LEFT JOIN
items a
ON
p.FirstMember = a.ID
LEFT JOIN
items b
ON
p.SecondMember = b.ID
编辑:
或者,当然,您每次都可以使用类似的select语句。
答案 3 :(得分:0)
从表格中选择时,您可以使用AS命名列的结果。
SELECT st.ID, st.FirstMember, st.SecondMember, ft1.Name + ft2.Name AS PairName
FROM Second_Table st
JOIN First_Table ft1 ON st.FirstMember = ft1.ID
JOIN First_Table ft2 ON st.SecondMember = ft2.ID
应该给你一些你喜欢的东西。