MI6UGRU
.pdfГлава 10: Запросы
11.В окошке и поместить в таблицу, введите НАСЕЛЕНИЕ в качестве имени для этой таблицы.
12.Функция Count(*) считает все записи в таблице. Таким образом, мы группируем все страны по континентам, MapInfo подсчитывает число стран на каждом контитенте и помещает результат в колонку, названную СТРАНЫ (это псевдоним).
Count(*) подсчитывает общее число записей в таблице. Но поскольку мы группируем государства по колонке КОНТИНЕНТ, то MapInfo выдаст количество стран для каждого континента в отдельности и поместит его в колонку СТРАНЫ (псевдоним названия колонки).
197
Глава 10: Запросы
Будет получена таблица, показанная на рисунке.
Условие Where
Выражение Where в окошке с условием позволяет объединять таблицы MapInfo более логично и более просто.
Порядок полей
Порядок полей, используемых в объединении таблиц не имеет значения. Любой из вариантов синтаксиса приемлем:
Select * from A,B where A.field1 = B.field1
Select * from A,B where B.field1 = A.field1
Таким образом, учтите, что когда Вы переключаете порядок географических операндов, географические операторы так же должны измениться. Следующие операторы производят одинаковые результаты:
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 Us_custg.state = States.state and States.state = City_125.state and Us_custg.order_amt > 10000
198
|
Глава 10: Запросы |
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 |
|
Обработка ошибок
Если составленное условие Where использует OR как логический оператор, то MapInfo выдаст сообщение об ошибке. Обычно такое сообщение появляется тогда, когда MapInfo не может найти объединение между двумя таблицами. Например, если Вы ввели следующее некорректное условие:
Select * from A,B where A.field1 = B.field1 or A.field1 = B.field2
Появится сообщение об ошибке “No join specified between A and B. Invalid join condition in Where clause”.
Внешнее объединение
Внешнее объединение SQL имеет отношение к процессу объединения данных из большой таблицы и таблицы меньших размеров, в результате которого Вы хотите получить результат из всех записей большой таблицы объединенных с некоторыми записями из малой таблицы. Если Вы используете стандартное объединение, то возникает проблема. Стандартное объединение в SQL-Запросе производит таблицу только с теми записями, которые совпадают. Вам могут понадобиться пустые поля, где нет совпадения. Например, предположим, Вы имеете таблицу со списком всех квартир в здании. Также есть таблица, содержащая записи всех жильцов. Обе таблицы имеют поле с номерами квартир. Ваша задача создать таблицу для всех квартир с фамилиями жильцов. Некоторые квартиры свободны и имеют пустые поля в графе жильцы.
На первом шаге создается подмножество данных, где имеется соответствие квартир и жильцов в них.
1.Выполните команду ЗАПРОС > SQL-ÇАПРОС. Заполните диалог следующим образом:
199
Глава 10: Запросы
2.Нажмите OK. Ваш запрос появится в окне Списка. Необходимо сохранить этот запрос к базовой таблице.
3.Выполните команду ФÀÉË > ÑОХРАНИТЬ КОПИЮ. Появится диалог “Создать копию таблицы”. Выберите подходящий каталог для Вашего файла и назовите таблицу RESULT.TAB. Нажмите кнопку СОХРАНИТЬ.
4.Выполните команду ФÀÉË > ÎТКРЫТЬ ТАБЛИЦУ и откройте таблицу RESULT. Эта таблица включает в себя те записи из обоих таблиц, где имеется соответствие.
200
Глава 10: Запросы
5.Далее Вы должны выбрать записи из таблицы КВАРТИРЫ, которые не имеют соответствия в таблице жильцов. Выполните команду ЗАПРОС > SQL-ÇАПРОС è
заполните диалог следующим образом:
6.Результирующая таблица запроса - это список всех квартир, которых нет в таблице RESULT. Чтобы включить эти записи в таблицу RESULT, нужно
присоединить их. Выполните команду ТАБЛИЦА > ÄОБАВИТЬ ЗАПИСИ В
ТАБЛИЦУ.
7.Присоедините таблицу результатов последнего запроса к таблице RESULT. Будет присоединен список свободных квартир к списку занятых квартир. Если колонки не присоединились правильно после применения операции Append, обратитесь к документации MapInfo для решения этой проблемы.
Поиск информации внутри колонки данных - функция InStr
Функция InStr используется для размещения строковой переменной внутри большой строковой переменной. Эта функция полезна для поиска символьных полей, чтобы определить позицию определенного строкового символа или группы символов. Она также может быть полезна для поиска любой части строкового символа.
201
Глава 10: Запросы
Например, Вам надо выбрать все улицы в таблице ДОРОГИ, содержащие слово “Большая” в колонке УЛИЦЫ.
Заполните SQL-Запрос следующим образом:
Если функция InStr встретит любое появление “Большая,” она вернет позицию на следующее за этим место.
Синтаксис функции INSTR определяется следующим образом:
INSTR ( position, string, substring)
ãäå: position - это стартовая позиция поиска
string - это строковый символ или поле, содержащее строковый символ, который надо найти
substring - это строковый символ, который следует найти Например, Если Ваши данные выглядят следующим образом:
“Это образец функции вставки.”
Вы хотите найти позицию “образец” Функция INSTR будет выглядеть следующим образом:
202
Глава 10: Запросы
INSTR(1,” Это образец функции вставки.”,”образец”) Когда операция будет выполнена, возвратится величина 5.
Внимание: Если строковый символ, который Вы ищете, не существует, то будет возвращено значение 0.
Для более подробной информации смотрите Приложение D: Создание выражений.
Выбор записей из одной таблицы, которых нет в другой
таблице
Следующий SQL-оператор позволит Вам выбрать записи из одной таблицы, которых нет в другой таблице, основываясь на поле, общем для двух таблиц. Например, если есть таблица, ОБЛАСТИ1 и надо выбрать все записи из таблицы ОБЛАСТИ1, которых нет в таблице ГОРОДА125.
1. Выполните команду ЗАПРОС > SQL-ÇАПРОС.
Внимание: Синтаксис оператора следующий: NOT имя_колонки IN(SELECT
имя_колонки FROM второй_таблицы)
203
Глава 10: Запросы
2. Этот оператор SQL осуществляет запрос всех записей в таблице
ОБЛАСТИ1.Tab, которые не существуют в таблице ГОРОДА125.Tab.
Выбор четных или нечетных записей из таблицы
Каждая запись в таблице имеет порядковый номер в колонке RowID. Допустим, Вам надо выбрать все четные записи из таблицы. Самый простой путь – использовать колонку RowID.
Для выбора четных записей сделайте следующее:
выполните команду ЗАПРОС > SQL-ÇАПРОС. Заполните диалог следующим образом:
Внимание: RowID - это функция, а не имя колонки в таблице Области1.
Чтобы выбрать нечетные записи из таблицы, сделайте следующее:
выполните команду ЗАПРОС > SQL-ÇАПРОС. Заполните диалог следующим образом:
204
Глава 10: Запросы
Внимание: RowID - это функция, а не имя колонки в таблице Области1.
205
Глава 10: Запросы
Выбор улиц из таблицы StreetInfo
Если Вы используете продукты MapInfo StreetInfo, то может понадобиться поместить
часть улиц на отдельный слой. Следующий раздел демонстрирует типичный запрос.
1.Выполните команду ФÀÉË > ÎТКРЫТЬ ТАБЛИЦУ. Выберите файл StreetInfo. В нашем примере имя таблицы МОСКВА.TAB.
2. Выполните команду ЗАПРОС > SQL-ÇАПРОС. Заполните диалог следующим образом:
В результате будет создана новая таблица с именем ТРАССЫ, содержащая все главные дороги из таблицы StreetInfo МОСКВА.
3.Выполните команду ФÀÉË > ÑОХРАНИТЬ КОПИЮ и сохраните таблицу ТРАССЫ. Теперь таблица ТРАССЫ может быть добавлена к карте как отдельный слой.
Внимание: Примененный выше оператор SQL-Запроса выбирает все главные дороги, которые определены в дорожных кодах. Чтобы определить класс дороги, которую Вы хотите выбрать, используйте инструмент Info для некоторых улиц или обратитесь к документации StreetInfo для разъяснения разных классов дорог.
206