2014-02-03 7 views
3

Я имею в виду ответ Иордании относительно «решения эволюционирующих схем» Dealing with evolving schemas.Таблицы союзов с другой схемой

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

Select a,b,c 
FROM (Select 1 as a, 2 as b), --Test_a 
    (Select 1 as a, 2 as b, 3 as c), --Test_b 

работает отлично ... я поставил Test_a и Test_b в физические таблицы (все поля обнуляемым) и попробовал:

Select a,b,c 
FROM (Select a,b, from BI_WORKSPACE.Test_a), 
     (Select a,b,c from BI_WORKSPACE.Test_b) 

Он также прекрасно работает

, но когда я попытался

Select a,b,c 
FROM BI_WORKSPACE.Test_a, 
    BI_WORKSPACE.Test_b 

Не удалось ... Есть ли ошибка, что-то я делаю неправильно? Последний образец - тот, который я получил после того, как он позволяет мне «развить» мою схему с течением времени. я бы хотел избежать изменения схемы всех существующих таблиц всякий раз, когда добавляю столбец для поддержки новой бизнес-потребности.

Большое спасибо за помощь.

Причина для спрашивать:. Мы проводим наши данные в «Ежедневные таблицы» поэтому при запросе мы платим только за период мы заинтересованы в Как BQ не поддерживает «динамический SQL», мы создали автономный который принимает шаблон запроса и генерирует запрос на требуемый период. Что-то вроде: Вход:

Select a,b,c FROM [<Source>] 

Выход:

Select a,b,c FROM [MYDATASET.TABLE20140201], [MYDATASET.TABLE20140202], [MYDATASET.TABLE20140203], [MYDATASET.TABLE20140204] , [MYDATASET.TABLE20140205] , [MYDATASET.TABLE20140206] , [MYDATASET.TABLE20140207] 

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

ответ

2

Я не думаю, что последний запрос должен работы. Вы запрашиваете столбцы a, b и c из двух таблиц, но в одной из этих таблиц нет столбца с этим именем. Это похоже на ошибку запроса, поскольку вы явно запрашиваете столбец, который не существует в таблице.

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

Кажется, что он работает по назначению. Если вы не согласны, можете ли вы сообщить мне, почему?

+0

Спасибо Джордана за ваш ответ ... Честно говоря, я бы не ожидал, что первый и второй по work, но если они это сделают, я бы ожидать, что 3-го по работа также ... Я отредактировал вопрос, чтобы лучше объяснить мою мотивацию. –

+1

Помогает ли вам использовать «(SELECT * FROM [MYDATASET.TABLE20140201]) как ваш подзапрос (вместо того, чтобы явно указывать поля? Это не изменит, какие поля вы получите для доступа, поскольку вы 't изменить поля, которые действительно необходимы в запросе. –

+0

Я боюсь, что это не сработало ... Я попытался Выберите a, b, c FROM (SELECT * FROM [BI_WORKSPACE.Test_a]), (SELECT * FROM [BI_WORKSPACE.Test_b]), и получен Ошибка: Поле 'c' не найдено в таблице 'BI_WORKSPACE.Test_a'; –

1

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

В вашем случае это будет работать

SELECT a,b,c 
FROM (SELECT * FROM BI_WORKSPACE.Test_a), 
    (SELECT * FROM BI_WORKSPACE.Test_b) 
Смежные вопросы