从具有不同列名的两个表创建视图

Posted

技术标签:

【中文标题】从具有不同列名的两个表创建视图【英文标题】:Create view from two tables with different column names 【发布时间】:2012-11-09 17:44:33 【问题描述】:

有没有办法从两个表中创建一个视图,其中一个列在两个表中是不同的?我目前遇到的问题是 mysql 告诉我有一个 undefined index - 这很有意义,因为在一半的情况下,该列将不存在。

表格布局:

(post_rank_activity) ID, post_id, ... 日期 (reply_rank_activity) ID, rank_id, ... 日期

我希望生成的视图看起来像什么:

身份证 | Post_id |回复ID |日期 x x 空 x x 空 x x

还有 SQL:

$rankView = "Create or replace view userRank as (
select PRA.id, PRA.post_id, PRA.user_id, PRA.vote_up, PRA.rank_date
From post_rank_activity PRA)
union All
(select RRA.id, RRA.reply_id, RRA.user_id, RRA.vote_up, RRA.rank_date
from reply_rank_activity RRA)";

我得到的结果不是返回 null,而是为“post_id”字段返回“reply_id”的值,然后将所有其他值移过来 - 见下文:

身份证 | Post_id |回复ID |日期 x x 日期值 x x 回复 val date val x

有什么想法吗?

【问题讨论】:

尝试删除第二个 SELECT 周围的 (。它们不是必需的。 你能发布更多关于每个表的结构和它们之间的关系的信息吗? 【参考方案1】:

联合必须在所有部分中以相同的顺序包含相同的列。您应该在联合的每个部分中显式选择/声明空列:

SELECT PRA.id, PRA.post_id, NULL AS reply_id, PRA.user_id, PRA.vote_up, PRA.rank_date
FROM post_rank_activity PRA
UNION All
SELECT RRA.id, NULL AS post_id, RRA.reply_id, RRA.user_id, RRA.vote_up, RRA.rank_date
FROM reply_rank_activity RRA

【讨论】:

好吧,用空选择器学到了一些新东西。谢谢!【参考方案2】:

您的查询应如下所示

select PRA.id, PRA.post_id, null as Reply_id PRA.rank_date
From post_rank_activity PRA
union All
select RRA.id, null as post_id, RRA.reply_id, RRA.rank_date
from reply_rank_activity RRA

【讨论】:

你们两个有相同的正确答案 - 谢谢。 (他先写了,所以必须做正确的事:))+1虽然

以上是关于从具有不同列名的两个表创建视图的主要内容,如果未能解决你的问题,请参考以下文章

MySQL创建视图连接两个完整的表

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表

sqlserver创建视图

在两个不同的表中创建具有相同列的视图 SQL

如何创建具有两个表视图的视图,每个表视图在每一行上重用一个pickerview

在对象视图中插入数据时列名重复