Помогите со сложным запросом, уже всю голову сломал

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 25.12.2004 (Сб) 19:59

Читай книжки по основам баз данных. То, что тебе нужно, называется FOREIGN KEY (внешний ключ)...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 27.12.2004 (Пн) 13:01

Запрос можно написать, но структура таблиц такая, что очень громоздкий он получится. Было бы легче, если бы было 3 отдельных таблицы с кодами для округа, населенного пункта и района.

Есть альтернативное предложение: составь сначала запрос, который по тексту выбирает код из ADDR. Кстати, коды, надеюсь, для района, населенного пункта и округа не пересекаются?

Когда пользователь запросит результат, то выполнишь этот запрос отдельно для района, населенного пункта и округа - получишь их коды. Потом спокойно напишешь запрос по поиску в таблице MAIN.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 27.12.2004 (Пн) 13:04

Хороший вариант, если пользователь вводит не абы какие текстовые данные а выбирает из выпадающего списка. Тогда код уже будет жестко задан и нужно будет осуществлять прямой поиск по коду.
Да и проблем с ошибками/опечатками не будет.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.12.2004 (Пн) 14:44

а выбирает из выпадающего списка.


Это поместу, иначе сами выпадающие списки могут оказаться дюже большими...

А вообще-то у человека, похоже проблема в составлении собственно элементарного запроса, показывающего результат в нужном виде.
То бишь связывающего основную табличку с подчиненными...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 27.12.2004 (Пн) 14:55

Andrey Fedorov писал(а):А вообще-то у человека, похоже проблема в составлении собственно элементарного запроса.

Ну, не совсем :). Посмотри на структуру таблиц внимательно. Видишь, MAIN тремя своими полями ссылается на ADDR - это значит, что если соединять, то 3 раза... Отсюда и проблемы. Поэтому и говорю, что проще, когда не одна справочная таблица на 3 поля, а честно 3 таблицы.

Отвлеченно:
Зацените постановку вопроса - написано ВСЕ, причем четко и понятно - дано, требуется, проблема! Такое редко бывает. Вопрошателю за это большое спасибо!
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.12.2004 (Пн) 15:10

Отсюда и проблемы.


Какие? Впрочем, кто их ищет, тот всегда найдет.

Поэтому и говорю, что проще, когда не одна справочная таблица на 3 поля, а честно 3 таблицы.


Да ничем не проще.

Ну разве в данном случае трудно написать нечто вроде:

Код: Выделить всё
SELECT id, fil, inv_no, R.name AS Район, S.name AS [Сельский округ], N.name AS [Населенный пункт], uli, dom, korp, kvr FROM MAIN M
    LEFT JOIN [ADDR] R ON M.ray = R.id
    LEFT JOIN [ADDR] S ON M.seo = S.id
    LEFT JOIN [ADDR] N ON M.nap = N.id


Тоже самое пришлось бы писать и в варианте с тремя таблицами.

Это ведь даже не только примитивно, но и скучно...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList