IGNORE "был указан несколько раз для" CTE - PullRequest
0 голосов
/ 21 мая 2018

Со следующим CTE:

WITH cteRoute AS (
    SELECT *
      FROM CRROUTE cr 
      JOIN crewleg cl on (cr.CDATE = cl.CDATE AND cr.CROUTE = cl.croute)
      left JOIN legmain lm on (lm.DAY = cl.DAY AND lm.DEP = cl.DEP and lm.CARRIER = cl.CARRIER and lm.FLT = cl.FLT and lm.LEGCD = cl.LEGCD )
      left JOIN legtimes lt on (lt.DAY = lm.DAY AND lt.DEP = lm.DEP and lt.CARRIER = lm.CARRIER and lt.FLT = lm.FLT and lt.LEGCD = lm.LEGCD )
      where cr.cdate = 14000
      and cr.croute = 138266498116
)

Я получаю сообщение о том, что CARRIER был выбран несколько раз в CTE.

И да, это правильно.Из-за SELECT * он действительно был выбран несколько раз.

У меня вопрос , а не , как это исправить.Я знаю, как это исправить, перечислив конкретные столбцы в запросе, а не выбирая их все через SELECT *.

Проблема в том, что база данных, с которой я работаю, принадлежит стороннему поставщику (в Греции), которые я не могу контролировать, и они ОЧЕНЬ "неаккуратны" в своей структуре и нормализации базы данных.

Этот запрос будет возвращать пару сотен столбцов. Я действительно не хочу специально перечислять их все.

Механизм запросов SQL Server вполне способенвытащить несколько столбцов с одним и тем же именем:

SELECT 'this' as LABEL, 'that' as LABEL

Будет работать нормально, возвращая два столбца ОБА с именем "LABEL".

У меня вопрос, есть ли способпопросить механизм запросов игнорировать повторяющиеся имена столбцов в общем табличном выражении?

Он может сделать это в обычном запросе (как показано выше), но, похоже, не может сделать это в CTE.

Рассматриваемые столбцы - это столбцы, используемые в соединении JOIN, и они всегда будут равны.

Обновление

Этот вопрос аналогичен другие вопросы, но имеет уникальный нюанс , который делает его НЕ дубликатом.Если этот файл на самом деле IS дубликат, то непременно отметьте его как таковой, и я буду весьма счастлив - особенно если у него есть ответ.

1 Ответ

0 голосов
/ 21 мая 2018

Вот один из способов уменьшить то, что нужно вводить вручную.

Запустите следующий код

  SELECT 
    CASE 
      WHEN t.name = 'crewleg' THEN 'cl.' + c.name + ','
      WHEN t.name = 'legmain' THEN 'lm.' + c.name + ','
      WHEN t.name = 'legtimes' THEN 'lt.' + c.name + ','
    END
  FROM sys.tables t
  join sys.columns c on c.object_id = t.object_id
  WHERE t.name in ('crewleg', 'legmain', 'legtimes')

Это вернет каждый столбец с предваряющими alias и .вместе с запятой после названия столбца.Скопируйте это в блокнот.На этом этапе вы можете просто найти столбцы, которые будут вызывать проблемы, и дать им псевдоним, чтобы они не были дубликатами.Также вы можете использовать notepad ++, чтобы найти и заменить все возвраты каретки, чтобы выбор не был таким длинным по вертикали.Не забудьте удалить последнюю запятую, так как она будет лишней.Затем просто скопируйте и вставьте его обратно в ваш выбор.

...