首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何构建虚拟列?

如何构建虚拟列?
EN

Stack Overflow用户
提问于 2013-07-30 13:50:52
回答 4查看 10.2K关注 0票数 0

如果这是一个基本的问题,很抱歉。我对SQL相当陌生,所以我想我只是遗漏了要搜索的概念的名称。

快速概述。

第一表(项目):

代码语言:javascript
运行
复制
ID     | name
-------------
1      | abc
2      | def
3      | ghi
4      | jkl

第二表(对):

代码语言:javascript
运行
复制
ID     | FirstMember   | SecondMember         Virtual column (pair name)
-------------------------------------
1      | 2             | 3                    defghi
2      | 1             | 4                    abcjkl

我正在尝试构建第二个表中显示的虚拟列,它可以在第二个表中的任何条目生成时生成,但是如果这样做,那么该列中的数据在第一个表中的某个项被重命名时就会出错。

我还知道,我可以在需要的时候构建该列(无论是普通请求还是存储过程),但这会导致代码重复,因为第二个表可能涉及多个不同的请求。

那么,是否有一种方法来定义一个“虚拟”列,该列可以作为一个普通列访问,但其内容是动态构建的?

谢谢。

编辑:这是在MsSql 2008,但引擎无关的解决方案将是首选。

编辑:上面的例子以多种方式被过度简化--主要是虚拟列内容不是两个名称的直接连接,而是更复杂的东西,这取决于我没有描述过的列的内容。尽管如此,你还是提供了多条有前途的路--我会回来的。谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-30 13:54:14

您需要两次加入items表:

代码语言:javascript
运行
复制
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;

然后将其放入视图中,您就有了“虚拟列”。在需要pair_name列的地方,只需查询视图而不是实际的pair_name表。

请注意,上面使用的是内部联接,如果"FirstMember“和"SecondMember”列可能为null,则可能需要使用外部联接。

票数 4
EN

Stack Overflow用户

发布于 2013-07-30 13:57:53

您可以使用视图,它根据查询结果创建类似于表的对象,例如提供了a_horse_with_no_name的对象。

代码语言:javascript
运行
复制
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;

然后查询结果,只需:

代码语言:javascript
运行
复制
SELECT id, pair_name FROM pair_names;
票数 2
EN

Stack Overflow用户

发布于 2013-07-30 14:00:49

如果您愿意,可以为您的“虚拟列”创建一个视图,如下所示:

代码语言:javascript
运行
复制
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语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17948940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档