2014-12-04 5 views
0

Предположим, у нас есть запросКак дублировать каждую строку в sql-запросе?

SELECT * FROM my_table ORDER BY id 

, что приводит к

id | title 
----------- 
1 | 'ABC' 
2 | 'DEF' 
3 | 'GHI' 

Как я мог бы изменить данный оператор выбора, что каждая строка дублируется в наборе результатов, как это:

id | title 
----------- 
1 | 'ABC' 
1 | 'ABC' 
2 | 'DEF' 
2 | 'DEF' 
3 | 'GHI' 
3 | 'GHI' 
+1

Это первый раз, когда я видел кого-то на самом деле * хочу * декартовой присоединиться вместо того, чтобы пытаться удалить один ... – Phylogenesis

ответ

0

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

select * 
from my_table 
    cross join 
     (select null 
     from dual 
     connect by level <= 2) 
order by id 
+0

это невероятно элегантно. –

+0

Вы также должны использовать 'select my_table. *', Чтобы дополнительный столбец, используемый в качестве генератора, не отображался. – Phylogenesis

1

Вы можете использовать union all, но мне нравится использовать cross join:

select * 
from MyTable cross join 
    (select 1 from dual union all select 2 from dual) n 
order by id; 

Причина, по которой мне нравится cross join, в случае, когда MyTable действительно сложный подзапрос. Хотя оптимизатор запросов может оценить его только один раз, вы не можете действительно зависеть от этого факта. Поэтому в этом случае производительность должна быть лучше.

+0

Спасибо! Thats идеально (как может быть в sql)! Почему бы не использовать UNION вместо UNION ALL в этом случае? Может ли это вызвать проблемы или нет разницы? –

+0

@FloppyRetop. , , В принципе, вы должны * никогда не использовать 'union', если вы не хотите, чтобы накладывали определенные накладные расходы на удаление повторяющихся значений. –

+0

Я согласен, что это так в общем случае, но было просто любопытно, что слово «все» действительно имеет значение в этом случае при выборе одной строки из двойного –

2

Попробуйте это ...

SELECT * FROM my_table 
UNION ALL 
SELECT * FROM my_table 
ORDER BY id 
+0

Вам нужно использовать 'UNION ALL', иначе он удалит дубликаты. – Barmar

+0

Правильный бармар - спасибо. Я отредактировал ответ – Brendan

+0

Неплохо. И что, если я хочу 5 дубликатов на каждый оригинал? –

Смежные вопросы