让我说我的第一个视图(ClothingID, Shoes, Shirts)
在第二种观点中,我有(ClothingID, Shoes, Shirts)
但是
数据完全不相关,即使ID字段无论如何都没有关联。
我希望它们合并为一个单一视图用于报告目的。
所以第三个视图(我试图制作的视图)应如下所示:(ClothingID, ClothingID2, Shoes, Shoes2, Shirts, Shirts2)
所以没有任何关系AT ALL,我只是把它们并排放在同一个视图中,不相关的数据。
非常感谢任何帮助
答案 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
将完成这项工作。
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
(
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)