Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.041 c
2-1129007753
Dimon777
2005-10-11 09:15
2005.11.06
Контекстная справка F1


11-1107760862
Ал
2005-02-07 10:21
2005.11.06
Помогите найти старые версии KOL MCK


14-1129195102
Бизон
2005-10-13 13:18
2005.11.06
Регистрация EhLib


4-1125679951
Ксардас
2005-09-02 20:52
2005.11.06
Подскажите ссылочку или в каком направлении копать


2-1129453062
antoxa2005
2005-10-16 12:57
2005.11.06
Для соритировки ADOTable я использую его св-во IndexFieldNames, а