Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

SQL запрос в FoxPro, соединение 2 таблиц   Найти похожие ветки 

 
Well   (2005-10-04 10:04) [0]

Задавал вопрос в разных форумах, но пока решения нет.

Задача соединить 2 таблицы: Phone и Code. Пример для наглядности.
Quote:
Таблица Phone: Таблица Code:

Tel Code Town
100ххх 100 aaaaa
200ххх 200 bbbbb
1000хх 1000 ccccc
10хххх 10 ddddd
100ххх  

Соединить надо по полю Code, тоесть при равенстве значения поля Code и поддстроки поля Tel. Результат должен быть таким:
Quote:
Таблица Rezult:

Tel Town
100ххх aaaaa
200ххх bbbbb
1000хх ccccc
10хххх ddddd
100ххх aaaaa

Если бы строки в поле Code были одинаковой длины, все было бы просто: SELECT tel, code FROM phone,code WHERE (tel=code)
Но длина подстроки различна и в результате запроса появляются лишние строки, так как сравнение 1000хх считается истиным
как со значением 1000 так и со значениеми 100 и 10 в таблице Code.

Подскажите как решить эту проблему?


 
Sergey13 ©   (2005-10-04 10:16) [1]

>Пример для наглядности
Пример не нагляден. Где там что?


 
Виталий Панасенко   (2005-10-04 10:26) [2]

У таблицы Phone код(города? страны?) вынести в отдельное поле(я) и не парить ....


 
ANB ©   (2005-10-04 10:31) [3]


> Tel Code Town
> 100ххх 100 aaaaa
> 200ххх 200 bbbbb
> 1000хх 1000 ccccc
> 10хххх 10 ddddd
> 100ххх  

В твоем случае никак. Т.к. :
1000хх - код здесь, это - 1, 10, 100 или 1000 ?
ЗЫ. SELECT tel, code FROM phone,code WHERE (tel=code) - с чего это такой запрос должен анализировать подстроку, а не сравнивать строки полностью ?


 
Well   (2005-10-04 11:00) [4]

ABN
Можно строку, можно выделить подстроку, проблема не меняется.

Виталий Панасенко  
Вынести код в отдельное поле не могу, так как получаю все в виде одной строки

Видимо ABN прав. Придется последовательно сканировать таблицу Phone по каждому значению кода, начиная с максимального значения кода, исключая строки в которых обнаружены совпадения :(.


 
Anatoly Podgoretsky ©   (2005-10-04 11:06) [5]

Ничего не понятно. Кто на ком стоял?
Соединение обычно делается так t1.id=t2.id


 
ANB ©   (2005-10-04 11:15) [6]


> Anatoly Podgoretsky ©   (04.10.05 11:06) [5]
- похоже, именно ID ему и надо расставить.


> Well   (04.10.05 11:00) [4]
- добавь поля связки по ИД и провязывай при добавлении кода. Будет намного быстрее. Кстати, логически эта задача все равно плохо решается.
Если после нулей всегда идет не 0, то это еще можно разделить. Но вот пример :
222 234 56 78
2222 45 67 85

- как ты отличишь, что у первого код 222, а у второго 2222 ?


 
Kulakov_an   (2005-10-04 11:31) [7]

Не совсем понял структуру этих таблиц
но возможно такой вариант пойдет хотя работать будет гораздо медленнее чем с Id  но как я понимаю задача такая что в БД пишутся телефонные звонки в которых есть номер телефона с кодом города  и есть отдельная таблица в которой указан код города и город
попробуй вот такой код  
SELECT tel, code FROM phone,code WHERE (tel like code||"%") но вот в отношении пред идушего примера отличие между 222 или 2222 будет действительно нехоношо но по крайней мере такие проги есть и работают


 
Well   (2005-10-04 12:35) [8]

Kulakov_an  
Да задача именно такая. И проблема в том что есть равноправные коды как 222 так и 2222.
Буду думать.
Всем спасибо!


 
Well   (2005-10-04 12:37) [9]


> 222 234 56 78
> 2222 45 67 85
>
> - как ты отличишь, что у первого код 222, а у второго 2222
> ?


В данном случае такой вариант исключен.
Главное определить, что в 2222 45 67 85  код 2222, а не 222!


 
ANB ©   (2005-10-04 12:38) [10]


> Well   (04.10.05 12:35) [8]
- вообще то АТС это как то разруливают. Поищи литературу по кодификации телефонных номеров. Если накопаешь - запости результат. Проблема интересная, так как всегда может вылезти подобная задача по билингу.


 
ANB ©   (2005-10-04 12:40) [11]


> В данном случае такой вариант исключен.
> Главное определить, что в 2222 45 67 85  код 2222, а не
> 222!
- каким образом исключен ?

2222345678
2222456785

- где какой код ?


 
Виталий Панасенко   (2005-10-04 12:48) [12]


> Вынести код в отдельное поле не могу, так как получаю все
> в виде одной строки

А откуда получаешь ?


 
Well   (2005-10-04 12:51) [13]


> > В данном случае такой вариант исключен.
> > Главное определить, что в 2222 45 67 85  код 2222, а не
>
> > 222!
> - каким образом исключен ?

Физически. Не бывает в номере после 222 цифра 2. А если она стоит, значит это цифра кода :).

> 2222345678
> 2222456785
>
> - где какой код ?


и там и там код 2222
А если 2223345678, то код 222


 
Anatoly Podgoretsky ©   (2005-10-04 13:40) [14]

Подробности покрыты мраком, примеров тоже наверно не увидим.
Партизаны торжествуют, гестапо в отчаяние.


 
evvcom ©   (2005-10-04 15:43) [15]


> Да задача именно такая. И проблема в том что есть равноправные
> коды как 222 так и 2222.

Ни фига не так. АТС разруливает очень просто. Полные телефонные номера 10-значные, если не приплетать сюда еще код страны. Например Москва (095)xxxxxxx. Если встречается 096 - это уже подмосковье. Дальше 1 или 2 цифры однозначно определяют район и/или город. Например 79 - Домодедово, дальше 5 цифр телефон в городе. Т.е. разбор идет слева направо, как и положено.


 
wal ©   (2005-10-04 15:50) [16]


> Полные телефонные номера 10-значные
Про зональные коды забыл - с ними полный номер может быть меньше 10. Кстати, начинаются они с двойки :)


 
Well   (2005-10-04 15:57) [17]


> Ни фига не так. АТС разруливает очень просто. Полные телефонные
> номера 10-значные, если не приплетать сюда еще код страны.
>  


Нет фига!
Поясняю. Речь идет об IP-телефонии. Код там определяется
<код страны><код города или области><номер>
Причем тарификация области отличается от тарификации областного центра
и потому надо различать код области, допустим "072" от кода города "0722".
Не говорю уже о междугородных кодах где длина их варьируется от 1 до 5 цифр.
Вот такая незадача.


 
evvcom ©   (2005-10-04 16:00) [18]


> Про зональные коды забыл

не забыл, решил пока умолчать. Но раз уж, то... Начинаются они с 2. В таком номере должно быть 8 цифр. Чего не хватает в номере телефона областного центра добивается слева двойками до 8 цифр. Все примерно так же.


 
evvcom ©   (2005-10-04 16:03) [19]


> Речь идет об IP-телефонии.

К 17 посту проснулся... С IP-телефонией разбираться не приходилось, но думаю принцип тот же, потому как машина должна однозначно определять, куда ей стучаться без каких-либо домыслов. Дядьки там умные сидят, ерунду бы не придумали, не зная потом, как разруливать.


 
Well   (2005-10-04 17:18) [20]

Причём здесь проснулся. Просто хотел абстрагироваться от практической задачи. Упростить как бы. Но похоже получилось наоборот :).


 
evvcom ©   (2005-10-04 17:21) [21]

"Хотел как лучше, а получилось как всегда". (c) Черномырдин :-)


 
Anatoly Podgoretsky ©   (2005-10-04 17:46) [22]

Well   (04.10.05 15:57) [17]
Поясняю. Речь идет об IP-телефонии. Код там определяется
<код страны><код города или области><номер>

<код страны><код города><код станции><код подстанции><код подстанции>...<номер телефона>


 
Kulakov_an   (2005-10-05 10:33) [23]

Странно каким образом работает АТС  (особенно аналоговые) ??? после 8 мы же набираем номер телефона с кодом города вместе и каким образом она это разруливает ???? возможно всетаки небывает таких ситуаций  как обрисовали ? (попробуйте по примеру позвонить к кому попадете?)
Для эксперемена попробуй сделать селект по справочнику кодов и выбери коды у которых один полностью входит в другой  ну отследи случай когда
222 и 2222 т.е. 222 входит в 2222. Я просто неуверен но таких случаев по идее недолжно быть. Можен я неправ так что небейте если что. Но проверить немешало бы.


 
wal ©   (2005-10-05 11:03) [24]


> [23] Kulakov_an   (05.10.05 10:33)
> Я просто неуверен но таких случаев по идее недолжно быть.
В телефонной сети общего пользования такого нет (и быль не может). Там каждый телефон имеей свой уникальный 11-значный номер. Потом уже идет деление на код страны-города-района-непосредственно номер. Причем разрядность может быть разной. Но таких совпаний типа Город1-код 123, Город2-код 1234 там быть не может.

С уважением.


 
Well   (2005-10-05 13:02) [25]


> Но таких совпаний типа Город1-код 123, Город2-код 1234 там
> быть не может.

Пример
0722   Код Белгорода
07241 Код Губкина
И ещё куча населенных пунктов. 072хх


 
Well   (2005-10-05 13:03) [26]


> Но таких совпаний типа Город1-код 123, Город2-код 1234 там
> быть не может.

Пример
0722   Код Белгорода
07241 Код Губкина
07247 Красная Гвардия
И ещё куча населенных пунктов. 072хх


 
wal ©   (2005-10-05 13:05) [27]

Читай внимательней:

> Причем разрядность может быть разной
и где в годе города Губкина (07241) содержится код Белгорода (0722)?


 
evvcom ©   (2005-10-05 14:33) [28]

072 - это код Белгородской области. Далее идет одна двойка, значит выбирается областной центр и в этом городе 6-ти значные номера. А 41 - это код Губкина в Белгородской области, в котором 5-ти значные номера. Если ты звонишь из области в Губкин, то можно набирать как 8-07241-xxxxx, так и 8-241-xxxxx. Разницы никакой, если только АТС посчитает по разным тарифам, хотя вряд ли.
Ну и? Ответь теперь, это коды, которые ты набираешь для звонка через IP-телефон?


 
Kulakov_an   (2005-10-06 07:26) [29]

НУ ВОТ И РАЗОБРАЛИСЬ ;)


 
Anatoly Podgoretsky ©   (2005-10-06 12:56) [30]

Kulakov_an   (05.10.05 10:33) [23]
АТС работает по принципу дерева, цифры слева направо сразу делают правильное направление. Особенно легко это делается для декадно-шаговых АТС


 
Ищущий ©   (2005-10-06 15:36) [31]

Бредовое предложение : берем телефонный номер определяем все коды, которые могут в нем содержаться с определенного знака, выбираем самый длинный - он (за редким исключением и будет искомым) + добавляем несколько правил для каких-нибудь хитрых кодов.


 
Well   (2005-10-11 17:09) [32]

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

CLOSE ALL

 SELECT 2
 USE C:\MYPROGRAM\IP\qtarif.dbf EXCLUSIVE
 index on code1 tag code1
 *SET ORDER TO TAG code1
 SELECT 1
 USE c:\myprogram\ip\qtable.dbf EXCLUSIVE
 GO TOP
 len=6
 find=.F.
 tar=0

 DO WHILE EOF()=.F.

   DO WHILE len>0 AND find=.F.
     SELECT 2
     find=SEEK(LEFT(qtable.phone,len))
     tar=0
     IF find=.T.
       tar=qtarif.code
     ENDIF
     len=len-1
   ENDDO
   SELECT 1
   REPLACE NEXT 1 qtable.town WITH tar
   SKIP
   find=.F.
   len=6
 ENDDO  

Выбирал максимальную длину кода и сравнивал подстроку этой длины в набранном номере с таблицей кодов. Если находил код, добавлял идентификатор кода в дополнительное поле таблицы, если нет уменьшал длину подстроки на 1 и повторял поиск и.т.д.
И так для каждой строки главной таблицы.
Потом обычным образом соединял две таблицы по идентификатору кода
SELECT * FROM qtable,qtarif WHERE qtable.town=qtarif.code

Геморойно, но работает :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.039 c
2-1128957615
Gall
2005-10-10 19:20
2005.11.06
Получить список папок


14-1129555268
oldman
2005-10-17 17:21
2005.11.06
Нужен "сквозной почтовый сервер" :(


14-1129209430
oldman
2005-10-13 17:17
2005.11.06
Влияет ли на женщин программирование мужа? :)))


1-1129365346
Jimm
2005-10-15 12:35
2005.11.06
Как заставить показываться Hint на неактивной форме ?


14-1129204858
Ксардас
2005-10-13 16:00
2005.11.06
Транскрибация предложений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский