Смекни!
smekni.com

MapInfo Professional 90 Руководство пользователя (стр. 73 из 125)

При работе с несколькими таблицами Вы должны так заполнить окошко С условием, чтобы при выполнении запроса правильно сопоставлялись записи из разных таблиц. Рассмотрим таблицу WORLD с полем страны (Country) и таблицу экономической статистики ECO_STATS по всем странам мира.

Надо создать временную таблицу запроса, которая объединила бы оба набора данных:

• В поле Выбрать колонки: * (напомним, что звездочка означает, что в таблицу запроса надо включить все колонки исходных таблиц).

• В поле Из таблиц: WORLD, ECO_STATS.

• В поле С условием: WORLD.Country = ECO_STATS.Country

Две колонки, с помощью которых Вы сопоставляете записи из разных таблиц, не обязательно должны иметь одинаковое название. В качестве примера рассмотрим таблицу иностранных клиентов INT_CUST, содержащую колонку регионов сбыта ("Территория"). В эту колонку записаны названия континентов. Чтобы временно объединить эту таблицу с таблицей стран мира, составьте запрос следующим образом:

• Выбрать колонки: *

• В поле Из таблиц: WORLD, INT_CUST

• В поле С условием: World.Continent = Int_Cust.TERRITORY

Смотрите также в Справочной системе: "Пример - численность населения и площадь континентов".

Условие Where

Порядок полей, используемый при операции объединения, не имеет значения. Возможен следующие варианты синтаксиса:

Select * from A,B where A.fieldl = B.fieldl Select * from A,B where B.fieldl = A.fieldl

Имейте в виду, что когда меняете порядок географических операндов, то географические операторы также изменяются. Следующие операторы приводят к одинаковым результатам:

Select * from states, cities where states.obj contains cities.obj

Select * from states, cities where cities.obj within states.obj

Порядок предложений

Порядок полей, используемых в объединении таблиц, не имеет значения. Любой из вариантов синтаксиса приемлем:

Select * from Us_custg,States,City_125

where States.state = City_125.state and States.state = Us_custg.state and Us_custg.order_amt > 10000

Select * from Us_custg,States,City_125

where States.state = City_125.state and States.state = City_125.state and Us_custg.order_amt > 10000

Select * from Us_custg,States,City_125

where Us_custg.state = States.state and Us_custg.order_amt > 10000 and States.state = City_125.state

Внимание: Некоторые данные, используемые в этом примере, могут быть доступны только на сайте MapInfo (www.mapinfo.com/miprotutorial).

Обработка ошибок

Если составленное условие WHERE использует OR в качестве логического оператора, то MapInfo Professional выдаст сообщение об ошибке. Обычно такое сообщение появляется тогда, когда MapInfo Professional не может найти объединение между двумя таблицами. Например, если Вы ввели следующее некорректное условие:

Select * from A,B where A.field1 = B.field1 or A.field1 = B.field2 Появится сообщение об ошибке:

Не задано условие объединения A и B. Некорректное условие объединения в предложении Where

Географическое объединение таблиц

Если две таблицы имеют графические объекты, то MapInfo может объединить эти таблицы на основе пространственных отношений между объектами этих таблиц. Поэтому если таблицы не содержат общей колонки, то Вы можете объединить их географически.

В MapInfo Professional имеется несколько географических операторов. Они используются для выбора объектов на основании их взаимного расположения в пространстве. С географическими операторами в MapInfo Professional используется специальное ключевое слово: "obj" или "object". Оно определяет, что MapInfo должно вычислить значение на основании графических объектов, а не соответствующих им в таблице числовых полей.

Имя географического оператора указывается между географическими объектами; выбрать его можно в списке Операторы в диалоге SQL-запрос.

В таблице перечислены географические операторы:

Contains "Содержит". Объект A содержит объект B, если центроид B лежит в границах A.
Contains Entire "Полностью содержит". Объект A полностью содержит объект B, если граница B полностью лежит внутри границ A.
Within "Внутри". Объект A лежит внутри объекта B, если его центроид лежит в границах B.
Entirely Within "Полностью внутри". Объект A лежит полностью внутри объекта Б, если его граница полностью лежит внутри границ B.
Intersects "Пересекает". Объект A пересекается с объектом B, если они имеют хотя бы одну общую точку.

Различие между Contains и Within, с одной стороны, и Contains Entire и Entirely Within, с

другой, состоит в том, что Contains и Within основаны на анализе центроида объекта, а Contains Entirely и Entirely Within - на анализе всего объекта.

Рисунок объясняет это различие:

объект A содержит (Contains) объект B объект B внутри (Within) объекта A объект A содержит (Contains) объект B объект B внутри (Within) объекта A объект A полностью содержит (Contains Entire) объект B объект B полностью внутри (Entirely Within) объекта A объект A пересекает (Intersects) объект B объект B пересекает (Intersects) объект A

Во всех случаях объект A содержит объект Б, так как центроид объекта Б лежит внутри границы объекта A. Однако, на рисунке слева часть объекта Б лежит вне границ объекта A. А на рисунке справа весь объект Б лежит внутри объекта A. Только во втором случае мы говорим, что "объект A полностью содержит объект Б" или что "объект Б лежит полностью внутри объекта A". Далее, из того, что A полностью содержит Б, следует, что A содержит Б; а из того, что A полностью лежит внутри Б, следует, что A лежит внутри Б.

При этом следует помнить, что MapInfo Professional выполняет простые операции "Содержит" (Contains) и "Внутри" (Within) гораздо быстрее, чем "Содержит полностью" (Contains Entire) и Полностью внутри (Entirely Within). Поэтому, если Вам не обязательно точно знать, полностью ли один объект содержит другой, используйте Contains и Within вместо Contains Entire и Entirely Within.

Географические операторы удобно использовать при работе с несколькими таблицами. Если в таблицах нет колонки, которая определяла бы порядок объединения, Вы можете задать объединение с помощью географических операторов (в окошке "с условием"). При работе с таблицами городов и штатов Вы можете выполнить одну из следующих команд:

1. Cities.obj within States.obj

2. States.obj contains Cities.obj

В обоих случаях MapInfo ищет внутри каждого штата города и ставит в соответствие строке города строку этого штата. С помощью функций обобщения Вы можете сосчитать число городов в штате или найти какие-нибудь средние характеристики для городов каждого штата.

Если имеется таблица графств и таблица покупателей, причем графства изображены многоугольниками, а покупатели - точками, Вы можете задать географическое объединение командами:

1. Customer.obj within County.obj

2. County.obj contains Customer.obj

Географические операторы в частности используются в комбинации с подзапросами. Дополнительные разделы Справочной системы:

• Объединение двух таблиц по порядку строк

• Подзапросы

Объединение двух или более таблиц

Обычно необходимая Вам информация хранится в нескольких базах данных. Эти базы могут быть созданы Вами или приобретены у MapInfo. SQL-запрос позволяет задавать отношения между различными базами, чтобы Вы могли отображать на карте данных из многих баз одновременно.

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

В нашем примере как таблица областей, так и таблица заказов должна содержать колонку с названием области. С помощью такой колонки MapInfo может сравнивать объекты в двух таблицах. С помощью такой колонки MapInfo Professional может сравнивать объекты в двух таблицах.

CountyName Нас_1980 Нас_1990 Заказ # Покупате ль Область
Калмыкия 23 789 27 135 478001 Петров Калмыкия
Якутия 35 456 34 846 478002 Иванов Калмыкия
Бурятия 147 101 151 201 478003 Сидоров Бурятия

Таблица РОССИЯ Таблица ЗАКАЗЫ

При выполнении команды SQL-запрос Вы сравниваете данные в колонке Область таблицы РОССИЯ и колонки Область таблицы ЗАКАЗЫ. На этом основании MapInfo может объединить данные о заказах с демографическими данными об областях. Диалог SQL-запрос может содержать следующее:

Выбрать колонки: *

из таблиц: Россия, Заказы

с условием: Россия.Область = ЗАКАЗЫ.Область

Также важно следить за тем, чтобы порядок колонок в окошке "с условием" совпадал с порядком таблиц в окошке "из таблиц". Также рекомендуется при задании условия объединения помещать условие объединения на первое место в окошке "с условием". Количество строк в результате запроса зависит от того, насколько таблицы соответствуют друг другу. Таким образом, в предыдущем примере, MapInfo Professional выберет некоторые или все записи из таблицы РОССИЯ. В результирующей таблице будут также данные скопированные из таблицы ЗАКАЗЫ, но таблица ЗАКАЗЫ по существу не будет скопирована.

Количество записей в результирующей таблице, получившиеся после объединения двух таблиц, будет зависеть от того, как хорошо две таблицы соответствуют друг другу. Например, в таблице Заказы - 10000 записей и Вы связываете ее с таблицей РОССИЯ, в которой 89 строк. В результирующей таблице может оказаться не более 10000 строк. Однако, если для записи из таблицы Заказы не найдется подходящей в таблице РОССИЯ, результат будет состоять менее чем из 10000 строк. Таким образом, если 400 записей таблицы ЗАКАЗЫ не содержат названия области (возможно из-за ошибок при вводе данных), а объединение зависит от названия области, то в результирующей таблице будет только 9 600 записей.