Как я могу объединить несколько таблиц с одним и тем же автоматически сгенерированным целым числом из одной «таблицы»?

#sql #join #random #sap #hana

#sql #Присоединиться #Случайный #хана

Вопрос:

Я хочу создать случайно выбранную таблицу с перекрестным соединением, которая автоматически увеличивает свой собственный идентификатор и присоединяется к нему. Допустим, мои таблицы выглядят следующим образом.

Человек

 Firstname, Lastname 

Hans      | Müller
Joachim   | Bugert

Address
City, Street, StreetNumber
Hamburg | Wandsbeckerstr. | 2
Berlin  | Konradstraße    | 13
  

Теперь я хочу объединить таблицы с автоматически сгенерированным идентификатором, и они должны быть выбраны случайным образом.
Итоговая таблица должна выглядеть следующим образом

 ID,Firstname,Lastname, City, Street, StreetNumber
1 |Hans|Bugert|Berlin|Wandsbeckerstr|2
2|Joachim|Müller|Hamburg|Konradstraße | 13
  

Что я уже пробовал или использовал:

Здесь я автоматически генерирую идентификатор, в котором я хочу объединить таблицы на

 select GENERATED_PERIOD_START as ID FROM SERIES_GENERATE_INTEGER(1,1,10)
  

Проблема в том, что перекрестное соединение и внутреннее соединение у меня не работают, потому что оно всегда объединяет все со всем или не объединяет с тем же идентификатором.

 SELECT Person."Firstname", Person."Lastname", Address."City",Address."Street", Address."StreetNumber"

FROM 
(   select GENERATED_PERIOD_START as ID FROM SERIES_GENERATE_INTEGER(1,1,10)

) autoGenID
inner JOIN
(select "Firstname" ,"Lastname" FROM Person ORDER BY RAND()) Person

inner JOIN 
(select "City", "Street", "StreetNumber", FROM Address  ORDER BY RAND()) Address

JOIN ON autoGenID."ID"=?????
  

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

Спасибо за вашу помощь или идеи, как это решить!

Ответ №1:

Я думаю, вы хотите:

 SELECT p."Firstname", p."Lastname", a."City", a."Street", a."StreetNumber"
FROM (SELECT p.*,
             ROW_NUMBER() OVER (ORDER BY RAND()) as seqnum
      FROM Person p
     ) p JOIN
     (SELECT a.*,
             ROW_NUMBER() OVER (ORDER BY RAND()) as seqnum
      FROM Address a
     ) a
     ON p.seqnum = a.seqnum;
  

Комментарии:

1. @Schwenk amp; GordonLinoff Нет смысла рандомизировать оба ввода для объединения.

2. @philipxy . . . Это верно, но seqnum необходимо вычислять в обоих подзапросах, поэтому нет никакого вреда в рандомизации для обоих.