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()
существует в PostgreSQL 8.4 и выше .
Если у вас более низкая версия, вы можете имитировать 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
Добавлено после комментария:
Я заметил и исправил ошибку в предыдущем запросе.
Я постараюсь немного объяснить. Прежде всего нам нужно добавить номера строк в оба представления, чтобы убедиться, что в идентификаторах нет пробелов. Это довольно простой способ:
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
).
Пример в реальном времени на data.stackexchange.com - нумерация строк .
После этого мы можем использовать оба подзапроса с номерами строк, чтобы присоединиться к ним (full outer join
в Википедии ), живой пример на data.stackexchange.com - объединить два несвязанных представления .