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