将两个不相关的视图合并到一个视图中

时间:2012-02-03 15:09:52

标签: sql postgresql views

让我说我的第一个视图(ClothingID, Shoes, Shirts) 在第二种观点中,我有(ClothingID, Shoes, Shirts)但是 数据完全不相关,即使ID字段无论如何都没有关联。 我希望它们合并为一个单一视图用于报告目的。 所以第三个视图(我试图制作的视图)应如下所示:(ClothingID, ClothingID2, Shoes, Shoes2, Shirts, Shirts2) 所以没有任何关系AT ALL,我只是把它们并排放在同一个视图中,不相关的数据。

非常感谢任何帮助

5 个答案:

答案 0 :(得分:2)

select v1.ClothingID, v2.ClothingID as ClothingID2, v1.Shoes, v2.Shoes as Shoes2,
    v1.Shirts, v2.Shirts as Shirts2
from (
    select *, row_number() OVER (ORDER BY ClothingID) AS row
    from view_1
) v1
full outer join (
    select *, row_number() OVER (ORDER BY ClothingID) AS row
    from view_2
) v2 on v1.row = v2.row

我认为使用新的无关列full outer join连接表的row将完成这项工作。

<{3}}中存在

row_number()

如果您的版本较低,可以模仿row_number,例如下面的示例。只有在ClothingID在视野范围内是唯一的时候才会起作用。

select v1.ClothingID, v2.ClothingID as ClothingID2, v1.Shoes, v2.Shoes as Shoes2,
    v1.Shirts, v2.Shirts as Shirts2
from (
    select *, (select count(*) from view_1 t1 
        where t1.ClothingID <= t.ClothingID) as row
    from view_1 t
) v1
full outer join (
    select *, (select count(*) from view_2 t2 
        where t2.ClothingID <= t.ClothingID) as row
    from view_2 t
) v2 on v1.row = v2.row
评论后

添加

我注意到并纠正了前一个查询中的错误。

我会试着解释一下。首先,我们必须在两个视图中添加行号,以确保id中没有间隙。这很简单:

select *, (select count(*) from view_1 t1 
    where t1.ClothingID <= t.ClothingID) as row
from view_1 t

这包括两件事,简单的查询选择行(*):

select *
from view_1 t

PostgreSQL 8.4 and above

(
    select count(*)
    from view_1 t1
    where t1.ClothingID <= t.ClothingID
) as row

这将计算包含self的行之前的每行外部查询(此处为(*))。因此,您可以说计算视图中每行ClothingID小于或等于当前行的所有行。对于唯一的ClothingID(我假设),它会为您提供行号(按ClothingID排序)。

correlated subquery (read more on wikipedia)上的实例。

之后,我们可以使用带行号的子查询加入它们(data.stackexchange.com - row numbering),full outer join on Wikipedia上的实例。

答案 1 :(得分:2)

您希望合并结果,但能够将行分开
复制所有列将有点过分。添加一个包含源信息的列:

SELECT 'v1'::text AS source, clothingid, shoes, shirts
FROM   view1

UNION  ALL
SELECT 'v2'::text AS source, clothingid, shoes, shirts
FROM   view2;

答案 2 :(得分:1)

如果视图不相关,SQL将很难处理它。你可以做到,但有更好更简单的方法......

我建议将它们一个接一个地合并,而不是像你建议的那样并排,即 union 而不是a 加入

select 'view1' as source, ClothingID, Shoes, Shirts
from view1
union all
select 'view2', ClothingID, Shoes, Shirts
from view2

对于这种情况,这将是通常的方法,并且易于编码和理解。

请注意UNION ALL的使用,它将行顺序保留为已选中且不会删除重复项,而UNION则对行进行排序并删除重复项。

被修改

添加了一列,指明该行来自哪个视图。

答案 3 :(得分:1)

你可以使用Rownumber作为连接参数和2个临时表吗?

类似于:

    Insert @table1
    SELECT ROW_NUMBER() OVER (ORDER BY t1.Clothing_ID ASC) [Row_ID], Clothing_ID, Shoes, Shirts)
    FROM Table1 

    Insert @table2
    SELECT ROW_NUMBER() OVER (ORDER BY t1.Clothing_ID ASC)[RowID], Clothing_ID, Shoes, Shirts)
    FROM Table2

    Select  t1.Clothing_ID, t2.Clothing_ID,t1.Shoes,t2.Shoes, t1.Shirts,t2.Shirts
    from @table1 t1
    JOIN atable2 t2 on t1.Row_ID = t2.Row_ID

我认为这应该是大致合理的。确保使用正确的连接,以便显示两个查询的完整输出

电子; FB

答案 4 :(得分:1)

您可以尝试以下操作:

SELECT *
FROM (SELECT row_number() over(), * FROM table1) t1
FULL JOIN (SELECT row_number() over(), * FROM table2) t2 using(row_number)