Объедините таблицы, выберите все, но несколько переименуйте SQL BQ - PullRequest
0 голосов
/ 17 июня 2020

Я хочу объединить две таблицы с 4 идентичными именами столбцов (ID, FieldID, FieldCropYear, UpdateUT C). Я хочу объединить эти две таблицы в FieldID.

Я использовал этот запрос:

 SELECT * FROM `xxx.yyy.111` AS ACT
    INNER JOIN `xxx.yyy.222` AS BOUND
    ON BOUND.FieldID = ACT.FieldID
    AND BOUND.FieldCropYear = ACT.FieldCropYear

После его запуска я получаю следующую ошибку: Duplicate column names in the result are not supported. Found duplicate(s): ID, FieldID, FieldCropYear, UpdateUTC

Можно ли выбрать *, но переименовать эти 4 столбца в одном фрейме данных? Как лучше всего с этим справиться? Возможно ли что-то вроде:

    SELECT * 
EXCEPT(ID, FieldID, UpdateUTC, FieldCropYear), 
                     ID as ID_b,
                     FieldID as FieldID_b,
                     UpdateUTC as UpdateUTC_b,
                     FieldCropYear as FieldCropYear_b
FROM `xxx.yyy.222` AS BOUND
    INNER JOIN `xxx.yyy.111` AS ACT
    ON BOUND.FieldID_b = ACT.FieldID
    AND BOUND.FieldCropYear_b = ACT.FieldCropYear

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Проверить using() вместо on - но там вы должны использовать все поля:

 SELECT * FROM `xxx.yyy.111` AS ACT
    INNER JOIN `xxx.yyy.222` AS BOUND
    USING(ID, FieldID, FieldCropYear,UpdateUTC)

Если это не имеет смысла, потому что некоторые поля на самом деле разные, тогда переименуйте некоторые поля в подзапросе:

 SELECT * FROM `xxx.yyy.111` AS ACT
    INNER JOIN 
     (select * EXCEPT(ID, UpdateUTC), ID AS actID, UpdateUTC as actUpdateUTC FROM `xxx.yyy.222`) AS BOUND
    USING(FieldID, FieldCropYear)

Не тестировал код, но надеюсь, что подходы понятны

0 голосов
/ 17 июня 2020

BigQuery выполняет в точности то, что вы хотите, используя replace:

SELECT bound.*,
       act.* REPLACE (id as id_act,
                      filedid as fieldid_act,
                      UpdateUTC as UpdateUTC_act,
                      FieldCropYear as FieldCropYear_act
                     )
FROM `xxx.yyy.222` BOUND JOIN
     `xxx.yyy.111` AS ACT
     ON BOUND.FieldID_b = ACT.FieldID AND
        BOUND.FieldCropYear_b = ACT.FieldCropYear;

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

SELECT BOUND, ACT
FROM . . .

Я не уверен, работает ли это для ваших целей.

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