如果这是一个基本的问题,很抱歉。我对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,但引擎无关的解决方案将是首选。
编辑:上面的例子以多种方式被过度简化--主要是虚拟列内容不是两个名称的直接连接,而是更复杂的东西,这取决于我没有描述过的列的内容。尽管如此,你还是提供了多条有前途的路--我会回来的。谢谢。
发布于 2013-07-30 13:54:14
您需要两次加入items表:
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,则可能需要使用外部联接。
发布于 2013-07-30 13:57:53
您可以使用视图,它根据查询结果创建类似于表的对象,例如提供了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;
发布于 2013-07-30 14:00:49
如果您愿意,可以为您的“虚拟列”创建一个视图,如下所示:
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语句。
https://stackoverflow.com/questions/17948940
复制相似问题