Невозможно преобразовать этот устаревший SQL в стандартный SQL в Google BigQuery - PullRequest
0 голосов
/ 25 марта 2019

Я не могу проверить этот устаревший SQL в стандартном BigQuery SQL, поскольку я не знаю, что еще требуется изменить здесь (этот запрос не выполняется во время проверки, если я выбираю стандартный SQL в качестве диалекта большого запроса):

SELECT
  lineitem.*,
  proposal_lineitem.*,
  porder.*,
  company.*,
  product.*,
  proposal.*,
  trafficker.name,
  salesperson.name,
  rate_card.*
FROM (
  SELECT
    *
  FROM
    dfp_data.dfp_order_lineitem
  WHERE
    DATE(end_datetime) >= DATE(DATE_ADD(CURRENT_TIMESTAMP(), -1, 'YEAR'))
    OR end_datetime IS NULL ) lineitem
JOIN (
  SELECT
    *
  FROM
    dfp_data.dfp_order) porder
ON
  lineitem.order_id = porder.id
LEFT JOIN (
  SELECT
    *
  FROM
    adpoint_data.dfp_proposal_lineitem) proposal_lineitem
ON
  lineitem.id = proposal_lineitem.dfp_lineitem_id
JOIN (
  SELECT
    *
  FROM
    dfp_data.dfp_company) company
ON
  porder.advertiser_id = company.id
LEFT JOIN (
  SELECT
    *
  FROM
    adpoint_data.dfp_product) product
ON
  proposal_lineitem.product_id=product.id
LEFT JOIN (
  SELECT
    *
  FROM
    adpoint_data.dfp_proposal) proposal
ON
  proposal_lineitem.proposal_id=proposal.id
LEFT JOIN (
  SELECT
    *
  FROM
    adpoint_data.dfp_rate_card) rate_card
ON
  proposal_lineitem.ratecard_id=rate_card.id
LEFT JOIN (
  SELECT
    id,
    name
  FROM
    dfp_data.dfp_user) trafficker
ON
  porder.trafficker_id =trafficker.id
LEFT JOIN (
  SELECT
    id,
    name
  FROM
    dfp_data.dfp_user) salesperson
ON
  porder. salesperson_id =salesperson.id

1 Ответ

1 голос
/ 25 марта 2019

Скорее всего, ошибка, которую вы получаете, выглядит примерно так:

Duplicate column names in the result are not supported. Found duplicate(s): name   

Устаревший SQL корректирует trafficker.name и salesperson.name в вашем операторе SELECT соответственно trafficker_name и salesperson_name, тем самым эффективно устраняя столбецдублирование имен

Стандартный SQL ведет себя по-разному и обрабатывает оба этих столбца с именем name, что приводит к случаю дублирования.Чтобы избежать этого - вам просто нужно предоставить псевдонимы, как в примере ниже

SELECT
  lineitem.*,
  proposal_lineitem.*,
  porder.*,
  company.*,
  product.*,
  proposal.*,
  trafficker.name AS trafficker_name,
  salesperson.name AS salesperson_name,
  rate_card.*
FROM ( ...

Вы можете легко проверить выше объясненное, используя ниже упрощенные / фиктивные запросы

#legacySQL
SELECT
  porder.*,
  trafficker.name,
  salesperson.name
FROM (
  SELECT 1 order_id, 'abc' order_name, 1 trafficker_id, 2 salesperson_id
) porder
LEFT JOIN (SELECT 1 id, 'trafficker' name) trafficker
  ON porder.trafficker_id =trafficker.id
LEFT JOIN (SELECT 2 id, 'salesperson' name ) salesperson
  ON porder. salesperson_id =salesperson.id

и

#standardSQL
SELECT
  porder.*,
  trafficker.name AS trafficker_name,
  salesperson.name AS salesperson_name
FROM (
  SELECT 1 order_id, 'abc' order_name, 1 trafficker_id, 2 salesperson_id
) porder
LEFT JOIN (SELECT 1 id, 'trafficker' name) trafficker
  ON porder.trafficker_id =trafficker.id
LEFT JOIN (SELECT 2 id, 'salesperson' name ) salesperson
  ON porder. salesperson_id =salesperson.id  

Примечание: если у вас есть больше повторяющихся имен - вам также нужно присвоить им всем псевдоним

...