Псевдоним значений таблицы запросов в Oracle SQL - PullRequest
2 голосов
/ 20 февраля 2011

У меня есть домашнее задание в SQL для Oracle 10g, где я должен применить объединение к двум различным операторам выбора, чтобы вернуть два столбца.Мне нужно, чтобы значения каждой ячейки в vendor_state указывали на CA, а каждое другое значение в другом состоянии возвращало «Внешний CA», чтобы указать, что они находятся в другом месте.

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

  SELECT vendor_name, 
         vendor_state
    FROM vendors 
   WHERE vendor_state IN 'CA'
UNION
  SELECT vendor_name, 
         'Outside CA' AS vendor_state
    FROM vendors
   WHERE vendor_state NOT IN 'CA'
ORDER BY vendor_name

Это дает мне точный ответ, который мне нужен, но я не знаю, почему псевдоним во втором операторе select может вести себя так ... объяснений нетв моем учебнике ничего из того, что я читал, не указывает на то, что псевдоним столбца может быть выполнен следующим образом.Но, переключая имя столбца и значение псевдонима, я заменил возвращаемое значение, а не само имя столбца ... Я не жалуюсь на результат, но было бы полезно, если бы я знал, как я это сделал.

1 Ответ

5 голосов
/ 20 февраля 2011

Хитрость:

В 1-м SELECT "vendor_state" - это значение самого поля из таблицы.А из-за предложения WHERE у вас будет только 'CA'

. Во втором SELECT "vendor_state" НЕ является значением из поля базы данных.Скорее, это просто псевдоним буквального значения «Внешний CA»

Поскольку оба имени совпадают (как того требует UNION), ваш конечный результат «выглядит так», как будто все значения получены из одного места, когда на самом деле ониdidnt.

Может быть, это покажет лучше:

SELECT vendor_name, vendor_state, vendor_state AS vendor_state_new
  FROM vendors 
 WHERE vendor_state IN 'CA'
 UNION
SELECT vendor_name, vendor_state, 'Outside CA' AS vendor_state_new
  FROM vendors
 WHERE vendor_state NOT IN 'CA'
ORDER BY vendor_name

Теперь для обоих запросов vendor_state показывает значение базы данных.И calculated_state показывает значение базы данных для 1-го SELECT и «Внешний CA» для 2-го.

В вашем запросе vendor_state выполняет роль моего vendor_state_new: показывает значение базы данных для 1-гоРасчетное значение для 2-го.И AS опущен в 1-м SELECT, потому что vendor_state AS vendor_state будет избыточным (но это может быть сделано для пояснения, и это хорошая привычка делать это, когда вы смешиваете вычисленные и «сырые» значения в данном имени столбца)

...