Объединить два несвязанных представления в одно представление - PullRequest
2 голосов
/ 03 февраля 2012

Допустим, у меня в моем первом представлении (ClothingID, Shoes, Shirts) а во втором виде у меня (ClothingID, Shoes, Shirts) ОДНАКО данные совершенно не связаны, даже поле идентификатора никак не связано. Я хочу, чтобы они были объединены в одно представление для отчетности поэтому третий вид (тот, который я пытаюсь сделать) должен выглядеть так: (ClothingID, ClothingID2, Shoes, Shoes2, Shirts, Shirts2) так что никакого отношения вообще нет, я просто помещаю их рядом, несвязанные данные в одно и то же представление.

Любая помощь будет высоко ценится

Ответы [ 5 ]

2 голосов
/ 04 февраля 2012

Вы хотите объединить результаты, но иметь возможность различать строки друг от друга .
Дублировать все столбцы было бы немного излишним. Добавить столбец с информацией об источнике:

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

UNION  ALL
SELECT 'v2'::text AS source, clothingid, shoes, shirts
FROM   view2;
2 голосов
/ 03 февраля 2012
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 - объединить два несвязанных представления .

1 голос
/ 19 августа 2013

Вы можете попробовать следующее:

SELECT *
FROM (SELECT row_number() over(), * FROM table1) t1
FULL JOIN (SELECT row_number() over(), * FROM table2) t2 using(row_number)
1 голос
/ 03 февраля 2012

Вы можете использовать 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

Я думаю, это должно быть примерно разумно. Убедитесь, что вы используете правильное объединение, чтобы отображались полные выходные данные для обоих запросов

е; фб

1 голос
/ 03 февраля 2012

Если представления не связаны, SQL будет бороться с этим. Вы можете сделать это, но есть лучший и более простой способ ...

Я предлагаю объединить их один за другим , а не бок о бок , как вы предлагали, т.е. объединение вместо присоединиться

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

Это был бы обычный подход для такого рода ситуаций, он прост для кодирования и понимания.

Обратите внимание на использование UNION ALL, который сохраняет выбранный порядок строк и не удаляет дубликаты, в отличие от UNION, который сортирует строки и удаляет дубликаты.

Отредактировано

Добавлен столбец, показывающий, из какого вида получена строка.

...