Программирование баз данных MS SQL Server (1084479), страница 30
Текст из файла (страница 30)
А что касается того, что приведенный выше оператор возвращает все столбцьс из обеих таблиц, то такой результат вполне соответствует ожиданиям. В операторе выборки использовался подстановочный символ *, который, как уже было сказано, обеспечивает получение данных из всех столбцов. Однако, как уже отмечалось, применение подстановочного символа * в операторах соединения не рекомендуется.
Операторы, имеющие подобный формат, являются краткими и удобными, но вместе с тем обладают существенными недостатками, поскольку их применение может повлечь за собой возникновение ошибок и способствовать снижению производительности. Одна из обогнован ных Рекоменданий, которую смдует пРи нять на вооРу жег сие с самого начала изучения гфогугоммиРования на языке 5~1., состоит в том, стобы осуизествлять выборку только необходимой инфоРмации и дт1ствипгельно использовать в прогузомме данные, полученные в Резульпиоое выборки. Эта Рекомендация основана на том, что для передачи любых дополниомльных данных строки или стол~~а требуепсл дополнительная пропускная способность сети„а также чаше всего дополнительнал обработка запроса в СУБД 5~А 5елгег.
В конечном итоге обнаруживается, что выборка ненужной информаиии отфикшпельно вли- 126 Глава 4 яет на производительность (заботы не только того пользователя, казна(зый в наставший момент ?зоботает с тфоеРоммой, но и всех д)зуеих пользователей системы, а также пользователей сети, в которой находится СУБД ЯОз Яезиег Указьзвайте в оно(зато)зе выборки только те свнмйвьь данные из кото)зых вы собироевмсь использовать, и н)поменяйте насвизлько оераничительные консофуккии ГНЕВЕ, насколько это возможно.
Если вам обязательно требуется применять подстановочный символ *, то при этом необходимо ограничиваться только теми таблицами, из которых должны быть получены данные всех столбцов. В таком случае использование подстановочного символа * будет вполне оправданным, поскольку никто не отрицает возможности выборки с его помощью данных из отдельных таблиц. Например, если бы требовалась вся информация о товарах, а из таблицы с данными о поставщиках нужно было получить только название компании поставщика, то можно было бы модифицировать приведенный выше запрос следующим образом: ЯЕЬЕСт Ргоапссв.*, Соирвпуквие РВОМ Ргоапссз 1ММЕВ 101М Япрр11егз ОМ Ргоапссв.эпрр11ег1О = Япрр11егз.эпрр11ег1О Прокрутка результатов этого запроса на экране слева направо показывает, что основная часть информации о поставщиках теперь исключена.
Безусловно, остался также только один экземпляр столбца Яцрр11ег1О. В конечном итоге в полученный результирующий набор вошли все столбцы из таблицы Ргоопсгз (поскольку подстановочный символ * был указан только для этой таблицы, а единственный экземпляр столбца Япрр11ег1О поступил из этой части списка выборки); с другой стороны, присутствует отдельный столбец с именем Сотрапунате (который берется из таблицы Япрр11егз). Теперь еще раз попытаемся выполнить тот же запрос, внеся в него только одно небольшое изменение: ЯЕЬЕСТ Ргоапссв.*, Япрр11ег1О РВОМ Ргоапссэ 1МНЕВ ЯО1Н Я рр11 в Ом Р апсгв.япррайег1О = япрр11егв.япррдйеггв Но на сей раз возникла проблема — появилось следующее сообщение об ошибке: Мзд 209, ьеое1 16, Ясвсе 1, Ь1пе 1 РлЬ1дпопв со1пвп пате 'Япрр11ег1О'.
Почему применение в запросе столбца Сотрапунате рассматривается как допустимое, а столбца Япрр11ег1Π— нет? Именно по той причине, которая указана в сообщении СУБД зОЬ Яегоег, — применяемое имя столбца является неоднозначным. Столбец Сотрапуиате имеется только в таблице Япрр11егз, а столбец Япрр11ег1О присутствует в обеих таблицах, поэтому СУБД оОЬ Яегуег не может определить, какой именно столбец нам требуется. Во всех вариантах запросов, применявшихся до сих пор для получения данных Япрр11ег1О, задача идентификации этого столбца бьиа разрешимой.
Иными словами, СУБД ЯЯЬ Яегуег получала указания, позволяющие определить, из какой таблицы должны быть взяты данные этого столбца. В первом запросе (в котором использовался простой подстановочный символ *) СУБД ЯОЬ Яегоег передавалось задание возвратить всю доступную информацию; в состав этой информации должны были войти оба столбца Япрр11ег1О, поэтому определение того, к какой таблице относят- Соединения 127 ся имена столбцов, не требовалось. Во втором примере (в котором было указано, что действие подстановочного символа * распространяется только на таблицу Ргобисгз) снова не было дано каких-либо конкретных указаний об использовании того или иного столбца Яирр11ег1Р.
Вместо этого была предусмотрена выборка данных всех столбцов из таблицы Ргоепсся, причем столбец Бирр11ег10 просто оказался одним из столбцов, вошедших в этот список. А задача определения того, к чему относится столбец Сотрапукаме, оказалась легко разрешимой, поскольку в двух таблицах есть только один столбец СотрапуМане, поэтому именно он нам и требуется. Таким образом, если необходимо сослаться на такой столбец, что в результатах соединения с помощью конструкции дО1И должно появиться несколько столбцов с одинаковыми именами, то требуется полностью уточнить имя столбца. Для этого может применяться один из двух описанных ниже способов.
С1 Указать имя таблицы, в которой находится требуемый столбец, затем поставить точку и указать имя столбца (например, таЬ1е. СО1шппнаае). П Обозначить таблицу псевдонимом и указать этот псевдоним, затем поставить точку и указать имя столбца (например, й11ая. СО1пмпнаме). Задача полного уточнения имен является несложной; пример того, как она решает ся, мы уже видели применительно к уточненному подстановочному символу *, однако еще раз проверим приведенный выше запрос, относящийся к столбцу Яорр11ег10, но с полностью уточненным именем столбца: ЯЕЬЕст Ргояэссз.*, я рртьегз.язрртьегто РВОМ Ргобиссз 1ММЕК готн Язрр11егз ОН Ргояассз.яэрр11ег1О = БэррУЕегэ.яарр11ег1О После этого возобновляется нормальная работа оператора выборки и в крайней правой части результирующего набора появляются данные столбца Яирр11ег1О из таблицы Бирр11егэ.
С другой стороны, способ, в котором предусматривается создание псевдонима для таблицы, лишь ненамного сложнее, но позволяет добиться того, чтобы формулировка запроса стала более лаконичной, а его удобство для чтения повысилось. Этот способ реализуется почти точно так же, как и способ применения псевдонима для столбца в простых операторах БЕЗВЕСТ, которые рассматривались в предыдущей главе. При этом достаточно лишь ввести сразу вслед за именем таблицы тот псевдоним, который должен использоваться для ссылок на эту таблицу.
Следует отметить, что, как и при указании псевдонимов столбцов, можно использовать ключевое слово йя (но по какой-то странной причине это ключевое слово не нашло широкого распространения на практике): ЯЕЬЕСТ р.*, з.яирр11егтв БРОМ Ргоеиссз Р 1ММЕЯ ЮО1М Яирр11егз з ОМ Р.Бирр11ег1О = з.яирр11ег1О После вызова этого кода на выполнение можно обнаружить, что полученные результаты полностью совпадают с теми результатами, которые были сформированы в предыдущем запросе. Следует отметить, что псевдонимы применяются по принципу "все или ничего".
После принятия решения об использовании псевдонима для какой-то таблицы этот 128 Глава 4 псевдоним должен быть подставлен вместо имени таблицы во всех частях запроса. С другой стороны, для одних таблиц могут быть заданы псевдонимы, а для других— нет, но в таком случае код теряет единообразие. В этом можно убедиться, ознакомившись со следующим запросом: ЯЕЬЕСт р.*, Япрраье .Ясрр11 ЬО РЕОИ Ртсбпстя р 1ННЕЕ 001Н Япррьбетя я ОН р.зпрр11ет10 = я.эсрраьетЬО На первый взгляд может показаться, что этот запрос должен быть выполнен успешно, но он приводит к возникновению следующей ошибки: Ияс 4104, Ьече1 16, Ятате 1, Ьтпе 1 Тпе нв1тт-ратт 1бепт1т1ет "Яирр11етя.зирр11ет10" соп1б пот Ье Ьоппб.
Еще раз отметим, что ситуация, в которой для одних таблиц предусмотрены псевдонимы, а для других — нет, является допустимой, но после принятия решения об использовании псевдонима для некоторой таблицы необходимо неизменно придерживаться выбранного обозначения. Еще раз вернемся к тем примерам, которые рассматривались в начале данной главы; в них заслуживает внимания еще одна особенность, которая состоит в том, что в первую очередь происходит возврат столбцов из первой таблицы, указанной в операторе с конструкцией д0114.