|
Программирование >> Руководство по sql
Внешние объединения При выполнении описываемых до сих пор объединений в результат включались только строки, удовлетворяющие условиям объединения. Однако вы можете захотеть поместить туда также и строки одной из таблиц, не удовлетворяющие условиям объединения. При внещнем объединении обычно в результат дополнительно включаются строки из первой таблицы, не удовлетворяющие условиям объединения. С помощью другого оператора внещнего объединения в результат можно включить все строки из второй таблицы, не удовлетворяющие условиям объединения, или даже такие строки из обеих таблиц. SQL-92 поддерживает только либо левое (LEFT), либо правое (RIGHT) внещнее объединение. Так как производители поддерживали эти возможности еще до появления общего стандарта, различные их реализации могут сильно различаться. В одних системах внещнее объединение определяется в предложении FROM, в других - в предложении WHERE. За подробной информацией обратитесь к руководству по своей системе. В Transact-SQL для определения внещнего определения в предложении WHERE используются следующие обозначения: Символ Значение *= Включить все строки первой таблицы =* Включить все строки второй таблицы Эти же обозначения поддерживаются и в SQL Anywhere. Как вы помните, в результате выполнения запроса, в котором ищутся авторы, живущие в одном городе с издателем, возвращается два имени (Abraham Bennet и Cheryl Carson). Чтобы включить в результат все имена из таблицы authors, независимо от того, удовлетворяют ли они условиям объединения, можно использовать внещнее объединение: SQL: select au fname, au lname, pub name from authors, publishers where authors.city *= publishers.city Результат:
Johnson White NULL Innes del Castillo NULL Sheryl Hunter NULL Chastity Locksley NULL Reginald Blotchet-Halls NULL Meander Smith NULL Оператор внешнего объединения *= заставляет систему включитъ в результат все строки из первой таблицы (в нашем случае authors), независимо от того, совпадают ли значения в ее столбце city с соответствующими значениями из таблицы publishers. Оператор внешнего объединения =* заставляет систему включить в результат все строки из второй таблицы, независимо от того, совпадают ли их значения со значениями из первой таблицы. Подставив в предыдуший запрос оператор правого внешнего объединения, вы получите имена издателей, находяшихся в городе, в котором живет какой либо автор, а также имена издателей, не удовлетворяющих этому условию: SQL: select au fname, au lname, pub name from authors, publishers where authors.city =* publishers.city Результат: au fname au lname pub name NULL NULL New Age Books NULL NULL Binnet & Hardley Cheryl Carson Algodata Infosystems Abraham Bennet Algodata Infosystems Как и в случае обычных объединений, для офаничения результатов внешнего объединения можно использовать условные операторы. Давайте сначала рассмотрим объединение, основанное на равенстве, а затем сравним его результаты с результатами внешнего объединения. Например, чтобы найти названия книг, количество проданных экземпляров которых превысило 50, можно использовать следующий запрос: SQL: select sonum, title from salesdetails sd, titles t where qty ordered > 50 and sd.title id = t.title id Результат: sonum title 1 Is Anger the Enemy? Чтобы, кроме того, найти все названия книг, не удовлетворяющих этому условию, нужно воспользоваться внешним объединением: SQL: select sonum, title from salesdetails sd, titles t where qty ordered > 50 and sd.title id =* t.title id Результат: sonum title NULL Secrets of Silicon Valley NULL The Busy Executives Database Guide NULL Emotional Security: A New Algorithm NULL Prolonged Data Deprivation: Four Case Studies NULL Cooking with Computers: Surreptitious Balance Sheets NULL Silicon Valley Gastronomic Treats NULL Sushi, Anyone? NULL Fifty Years in Buckingham Palace Kitchens NULL But Is It User Friendly? NULL The Psychology of Computer Cooking NULL You Can Combat Computer Stress! 1 Is Anger the Enemy? NULL Life Without Fear NULL The Gourmet Microwave NULL Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean NULL Straight Talk About Computers NULL Computer Phobic and Non-Phobic Individuals: Behavior Variations NULL Net Etiquette КАК ОБЪЕДИНЕНИЯ ОБРАБАТЫВАЮТСЯ СИСТЕМОЙ в запросе на объединение совсем не сложно допустить ошибку. Если в получаемом результате содержится слишком много строк или повторений, то, скорее всего, в запрос нужно внести какие-нибудь изменения. Однако по получаемым результатам очень трудно разобраться в том, как запросы на объединение обрабатываются в реляционных системах. Первым шагом обработки запроса на объединение является построение декартова произведения таблиц - всех возможных комбинаций строк из обеих таблиц. После получения декартова произведения столбцы из списка выбора используются для выполнения операций проектирования, а условия в предложении WHERE - для выбора, чтобы устранить строки, которые не удовлетворяют условиям объединения. Декартово произведение - это матрица всех возможных комбинаций, которые могут удовлетворять условиям объединения. Если в каждой таблице содержится по одной строке, то и комбинация будет единственной. Для примера рассмотрим две таблицы, содержащие по одной строке: one two а b three four Декартово произведение этих таблиц имеет следующий вид: one two three four abed Если в каждой таблице содержится по две строки, то в декартовом произведении будет четыре строки:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |