Sql для объединения двух несвязанных таблиц в один
У меня есть таблицы
таблица1
col1 col2
a b
c d
и table2
mycol1 mycol2
e f
g h
i j
k l
Я хочу объединить две таблицы, которые не имеют общего поля в одной таблице, как:
таблица 3
col1 col2 mycol1 mycol2
a b e f
c d g h
null null i j
null null k l
т.е. это похоже на размещение двух таблиц бок о бок.
Я застрял! Пожалуйста, помогите!
Ответы
Ответ 1
Получите номер строки для каждой строки в каждой таблице, затем выполните полное соединение, используя эти номера строк:
WITH CTE1 AS
(
SELECT ROW_NUMBER() OVER(ORDER BY col1) AS ROWNUM, * FROM Table1
),
CTE2 AS
(
SELECT ROW_NUMBER() OVER (ORDER BY mycol1) AS ROWNUM, * FROM Table2
)
SELECT col1, col2, mycol1, mycol2
FROM CTE1 FULL JOIN CTE2 ON CTE1.ROWNUM = CTE2.ROWNUM
Предполагается, что SQL Server >= 2005.
Ответ 2
Вариант 1: одиночный запрос
Вам нужно присоединиться к двум таблицам, и если вы хотите, чтобы каждая строка в таблице1 соответствовала только одной строке в таблице2, вы должны каким-то образом ограничить соединение. Вычислите номера строк в каждой таблице и присоединитесь к этому столбцу. Номера строк являются специфичными для базы данных; вот решение для mysql:
SELECT
t1.col1, t1.col2, t2.mycol1, t2.mycol2
FROM
(SELECT col1, col2, @t1_row := t1_row + 1 AS rownum FROM table1, (SELECT @t1_row := 0) AS r1) AS t1
LEFT JOIN
(SELECT mycol1, mycol2, @t2_row := t2_row + 1 AS rownum FROM table2, (SELECT @t2_row := 0) AS r2) AS t2
ON t1.rownum = t2.rownum;
Это предполагает, что таблица1 длиннее таблицы2; если table2 длиннее, используйте RIGHT JOIN
или переключите порядок подвыборок t1 и t2. Также обратите внимание, что вы можете отдельно указывать порядок каждой таблицы, используя предложение ORDER BY
в подвыборках.
(см. выберите счетчик приращений в mysql)
Вариант 2: пост-обработка
Подумайте о двух вариантах выбора, а затем соедините результаты с вашим любимым языком сценариев. Это гораздо более разумный подход.
Ответ 3
Это действительно хорошо, если вы расскажете о том, почему эта проблема должна быть решена. Я предполагаю, что это просто практика sql-синтаксиса?
В любом случае, поскольку строки не имеют ничего, что связано с ними, мы должны создать соединение. Я выбрал порядок их значений. Кроме того, поскольку они не имеют ничего, что связывает их, что также вызывает вопрос о том, почему вы хотели бы поставить их рядом друг с другом в первую очередь.
Вот полное решение: http://sqlfiddle.com/#!6/67e4c/1
Код выбора выглядит следующим образом:
WITH rankedt1 AS
(
SELECT col1
,col2
,row_number() OVER (order by col1,col2) AS rn1
FROM table1
)
,rankedt2 AS
(
SELECT mycol1
,mycol2
,row_number() OVER (order by mycol1,mycol2) AS rn2
FROM table2
)
SELECT
col1,col2,mycol1,mycol2
FROM rankedt1
FULL OUTER JOIN rankedt2
ON rn1=rn2