Объединить несколько таблиц, имеющих разные столбцы - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть 4 таблицы, каждая таблица имеет различное количество столбцов, как указано ниже.

tableA - 34
tableB - 47
tableC - 26
tableD - 16

Каждая таблица имеет общий столбец с именем id, теперь мне нужно выполнить объединение, проблема в том, что столбцы не равной длины и совершенно другой, я не могу сделать объединение.

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

Что такое оптимизированный Чтобы решить эту проблему, пробовали полное соединение, но это занимает слишком много времени.

Попытка пока

SELECT * FROM tableA FULL JOIN 
              tableB FULL JOIN 
              tableC FULL JOIN 
              tableD 
         USING (id)
         WHERE tableA.id = 123 OR
               tableB.id = 123 OR
               tableC.id = 123 OR
               tableD.id = 123 

1 Ответ

0 голосов
/ 15 февраля 2020

Snowflake имеет объявленное ограничение в использовании операторов Set (например, UNION):

При использовании этих операторов:

  • Убедитесь, что в каждом запросе выбрано одинаковое количество столбцов.

[...]

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

В вопросе недостаточно информации о том, сколько столбцов перекрывается (47 уникальных столбцов?), или если они все разные (46 + 33 + 25 + 15 = 119 уникальных столбцов?). Ответ на этот вопрос определит количество усилий, необходимых для записи каждого запроса, поскольку для этого потребуется адаптировать запрос из следующей формы:

SELECT * FROM t1

В явную форму с пустышкой столбцы, определенные с допустимыми значениями по умолчанию, которые соответствуют типу данных в таблицах, где они присутствуют:

SELECT
  present_col1,
  NULL AS absent_col2,
  0.0 AS absent_col3,
  present_col4,
  [...]
FROM
  t1

Вы также можете использовать мета-программирование с хранимыми процедурами , чтобы "сгенерировать" такой измененный запрос проверяя имена столбцов независимых результатов, используя Statement::getColumnCount(), Statement::getColumnName(), et c. API и формирование расширенной объединенной версии со значениями по умолчанию / пустыми.

...