Объединение двух таблиц без уникальных ключей без номера строки - PullRequest
0 голосов
/ 04 октября 2019

У меня есть две таблицы

Таблица A:

Name
----
Andy
Greg

Таблица B:

Value
-----
1
2

Iхочу объединить эти две таблицы в одну:

Таблица C:

Result
------
Andy 1
Greg 2

Примечание: -

без измененийприказ. Я не могу использовать row numbers, как я использую Apache Calcite, и он не поддерживает это прямо сейчас.

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Создайте новый столбец в качестве идентификатора

SELECT *, ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) AS id
INTO #NAMES
FROM TABLE1

SELECT *, ROW_NUMBER() OVER(PARTITION BY VALUE ORDER BY VALUE) AS id
INTO #VALUES_TABLE
FROM TABLE2

И затем присоединитесь к номеру строки, который будет называться id

SELECT *
FROM #NAMES t1
LEFT JOIN #VALUES_TABLE t2
ON t1.id = t2.id
0 голосов
/ 08 октября 2019

Кальцит не имеет такой функции, как Псевдостолбец Oracle ROWNUM , но у него есть стандартная оконная функция SQL ROW_NUMBER () . Вы можете использовать его следующим образом:

create table a as select * from (values ('Andy'), ('Greg')) as t (name);
create table b as select * from (values (1), (2)) as t (v);

select *
from (select name, row_number() over () as id from a)
join (select v, row_number() over () as id from b)
using (id);

+----+------+---+
| ID | NAME | V |
+----+------+---+
|  1 | Andy | 1 |
|  2 | Greg | 2 |
+----+------+---+
(2 rows)

Если вы хотите детерминированный порядок, вы можете изменить over (), скажем, over (order by name desc).

0 голосов
/ 04 октября 2019
WITH X AS 
(
SELECT * FROM
(
SELECT NAME AS Val1,

(SELECT  Count(*) from #TableA a1 WHERE a1.Name < a2.Name) AS myRowNumber1 FROM #TableA a2

)a1
INNER JOIN
(
SELECT Id AS Val2,

(SELECT  Count(*) from #TableB a1 WHERE a1.Id < a2.Id) AS myRowNumber2 FROM #TableB a2 
)b1

ON a1.myRowNumber1=b1.myRowNumber2
)

SELECT Val1 +' '+ Val2 AS Result FROM X

Вы можете использовать Count (*) вместо Row_Number ()

OutPut: -

Result
---------

Andy 1

Greg 2
...