Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Объединить попарно строки  [new]
jgbobby
Member

Откуда:
Сообщений: 2
Доброго дня. Помогите сделать запрос...
Дано: таблица, из 3х строк с колонками col1 col2 col3.
атрибуты:
1 строка 1 1 1
2 строка 2 2 2
3 строка 3 3 3
Нужно: сделать 2ую таблицу, которая будет содержать 9 строк, являющихся попарным объединением строк из основной таблицы с колонками col1_1 col2_1 col3_1 col1_2 col2_2 col3_2 - содержимым объединенных строк.
1 строка 1 1 1 1 1 1
2 строка 1 1 1 2 2 2
3 строка 1 1 1 3 3 3
4 строка 2 2 2 1 1 1
5 строка 2 2 2 2 2 2
6 строка 2 2 2 3 3 3
7 строка 3 3 3 1 1 1
8 строка 3 3 3 2 2 2
9 строка 3 3 3 3 3 3
Идеально, чтобы таблица состояла из 6 строк без повторений типа 1 1 1 1 1 1, 2 2 2 2 2 2, 3 3 3 3 3 3 (понятно, что можно потом почистить повторения, но если это можно сделать сразу же в запросе, было бы хорошо):
1 строка 1 1 1 2 2 2
2 строка 1 1 1 3 3 3
3 строка 2 2 2 1 1 1
4 строка 2 2 2 3 3 3
5 строка 3 3 3 1 1 1
6 строка 3 3 3 2 2 2
Спасибо
14 сен 21, 17:26    [22371829]     Ответить | Цитировать Сообщить модератору
 Re: Объединить попарно строки  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1527
jgbobby,

9 строк - cross join таблицы самой на себя
6 строк - join по условию >
14 сен 21, 17:43    [22371834]     Ответить | Цитировать Сообщить модератору
 Re: Объединить попарно строки  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1527
jgbobby,

--
--  9 строк:
with
  t (col1,col2,col3) as 
    (
       values (1,1,1)
            , (2,2,2)
            , (3,3,3)
    )
select *
  from t as t1
 cross join t as t2;

--
-- 6 строк: 
with
  t (col1,col2,col3) as 
   (
       values (1,1,1)
            , (2,2,2)
            , (3,3,3)
    )
select *
  from t as t1
  join t as t2
    on t1.col1 != t2.col1
   and t1.col2 != t2.col2
   and t1.col3 != t2.col3;


Сообщение было отредактировано: 14 сен 21, 17:45
14 сен 21, 17:53    [22371841]     Ответить | Цитировать Сообщить модератору
 Re: Объединить попарно строки  [new]
jgbobby
Member

Откуда:
Сообщений: 2
Я наверно зря такой пример привёл. Привёл я его для того, чтобы понятна задача была. На самом деле известно только количество столбцов в исходной таблице. Их 3. Количество строк 1000. Значения в строках разные. 1 1 1 и тд я просто для примера привел. То есть запрос должен быть общим, чтобы из таблицы 1 получить таблицу 2, представляющую собой попарно перебранные значения таблицы 1..
14 сен 21, 18:24    [22371866]     Ответить | Цитировать Сообщить модератору
 Re: Объединить попарно строки  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1527
jgbobby,

Вот этот кусок кода - лишь эмуляция ваших тестовых данных:
with
  t (col1,col2,col3) as 
    (
       values (1,1,1)
            , (2,2,2)
            , (3,3,3)
    )


Основной запрос - это вот этот кусок кода:
select *
  from t as t1
  join t as t2
    on t1.col1 != t2.col1
   and t1.col2 != t2.col2
   and t1.col3 != t2.col3;
Единственное, что для произвольных данных нужно заменить конъюнкцию скалярных неравенств на "векторное" неравенство.

На примере словарных таблиц PG:
select * 
  from pg_tables as t1
  join pg_tables as t2
    on (t1.schemaname, t1.tablename, t1.tableowner) != -- <-- "Векторное" неравенство
       (t2.schemaname, t2.tablename, t2.tableowner)
14 сен 21, 18:53    [22371877]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить