Псевдонимы значений таблицы запросов в Oracle SQL

У меня есть домашнее задание в SQL для Oracle 10g, где мне нужно применить объединение к двум различным операторам выбора, чтобы вернуть два столбца. Мне нужны значения каждой ячейки в vendor_state, чтобы указать CA, и любое другое значение в другом состоянии, чтобы вернуть «Outside 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 могут вести себя таким образом ... в моем учебнике не дается никаких объяснений, и ничто из того, что я прочитал, указывает на то, что псевдонимы столбцов могут быть сделано вот так. Но, переключив имя столбца и значение псевдонима, я заменил возвращаемое значение, а не само имя столбца ... Я не жалуюсь на результат, но было бы полезно, если бы я знал, как я это сделал.


person Strata    schedule 20.02.2011    source источник


Ответы (1)


Уловка заключается в следующем:

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

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

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

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

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 был бы избыточным (но это можно сделать в целях пояснения, и это хорошая привычка делать это, когда вы смешиваете вычисленные и "сырые" значения в заданном имени столбца)

person MestreLion    schedule 20.02.2011
comment
Большое спасибо! В этом есть большой смысл ... мой учебник дает множество примеров, но не объясняет механику выбора элементов или то, как связаны типы данных ... это дало мне большое понимание. Очень признателен! - person Strata; 20.02.2011
comment
Во-первых, исправляю себя: для UNION, на самом деле, должно соответствовать не ИМЯ, а их ДАТАТИП. Поскольку и поле базы данных vendor_state, и буквальное значение 'Outside CA' являются VARCHAR, все в порядке - person MestreLion; 20.02.2011
comment
Во-вторых ... вы понимаете, что для этого не нужен СОЮЗ, верно? СЛУЧАЙ .. КОГДА .. ТО конструкция была бы намного лучше. Google для этого. Возможно, для вас это немного сложнее, но он подходит для этого запроса НАМНОГО лучше, чем UNION. Поскольку ваш вопрос больше касался изучения псевдонимов, чем оптимизации запроса. я не упоминал об этом. Но избегайте выполнения UNIONS, когда все, что вам нужно, - это простой тест в одном столбце. - person MestreLion; 20.02.2011