如何构建虚拟列?

时间:2013-07-30 13:50:52

标签: sql

很抱歉,如果这是一个基本问题。我对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上,但首选的是与引擎无关的解决方案。

编辑:上面的示例以多种方式过度简化 - 主要的一点是虚拟列内容不是两个名称的直接串联,而是更复杂的,取决于我没有描述的列的内容。尽管如此,你提供了多条似乎很有希望的路径 - 我会回来的。感谢。

4 个答案:

答案 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

应该给你一些你喜欢的东西。