Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
ВнизКак связать две таблицы Найти похожие ветки
← →
Vmarchenko (2003-04-30 10:27) [0]Имеется 2 таблицы, буду объяснять сразу на примере
1.
Name
1125369
1123278
5697898987
569214547
2.
Kod Name
112 Aaaa
569 Bbbb
В результате мне хотелось бы получить выборку в таком виде:
1125369 Aaaa 5369
1123278 Aaaa 3278
5697898987 Bbbb 7898987
569214547 Bbbb 214547
Можно ли это выполнить одним запросом ?
Мне удалось это сделать путем написание процедуры в которой используется три подзапроса, но может есть способ лучше ?
← →
Zacho (2003-04-30 10:32) [1]Прямое нарушение 1НФ :)
Не проще ли почитать что-нибудь про нормализацию и в таблице 1 разбить поле Name на 2 поля !
← →
Sergey13 (2003-04-30 10:35) [2]2Vmarchenko (30.04.03 10:27)
Если я правильно понял, то код второй таблицы ссылается на первые три знака из Name первой? А зачем так сложно? Не проще ли в первой сделать такой же kod. Тогда одним запросом. Кроме того при такой структуре и ссылочная целостность работать не будет.
← →
Соловьев (2003-04-30 10:36) [3]
select t1.name, t2.name, t2.kod
from table1 t1
join table2 t2 on SUBSTRING(t1.name FROM 1 FOR 3)=cast(t2.kod as varchar(3))
← →
Vmarchenko (2003-04-30 11:28) [4]Я не нарушаюссылочную целостность. Попробую обяснить по другому.
В первой таблице находятнся номера телефонов включаюшие в себя коды городов куда направлен звонок. При чем код города может иметь различную длину (т.е (38552) (095) (812) и т.д.), следом идет номер телефона по которому говорили. Во второй таблице находяться коды города и наименование этого города. В результате выводится таблица с [Полным номером телефона] [НаименованиеГорода] [НомеромТелефона в городе(оставшаяся часть)]
Что теперь ?
← →
Zacho (2003-04-30 11:32) [5]
> Vmarchenko (30.04.03 11:28)
А как ты контролируешь RI ? К тому-же 1НФ все равно нарушается, поле в первой таблице явно не атомарно :)
Почему бы все-таки не сделать 2 поля: код города и номер телефона (без кода) ? И работать будет гораздо проще, и возможных аномалий избежишь
← →
Соловьев (2003-04-30 11:33) [6]
> Полным номером телефона]
этот номер должен вычисляться. он равен коду+телефон в городе.
и потом связывать надо по коду, а не резкой полного номера на части...
← →
MsGuns (2003-04-30 12:45) [7]Поддерживаю Zacho © (30.04.03 11:32) и Соловьев © (30.04.03 11:33) в базе явно неподобство ;))
← →
Vmarchenko (2003-05-05 10:47) [8]> 2All
Приятно видеть, что твой вопрос имеет отдачу от людей. Данные я выбираю из "таблицы" в которую записывается лог АТС-=ки которая м формирует этот пресловутый [КодГорода]+[НомерТелефона]. В Первой таблице находится полное отображение работы АТС, т.е. в нее сбрасывается: дата звонка, время звонка, входная линия, внутренняя линия, НОМЕР ТЕЛЕФОНА, пролжительность и т.д.
Потом я все это разгребаю "по полочкам" формирую выходную форму диалога в которой уже видно, что: звонили в такой-то город с такого то внутреннего телефона с такого отдела по такому номеру телефона (в дополнении еще скажу что подвязываю и телефонный справочник город, чтобы было видно кому звонили). Вот такие вот дела :(
> Zacho: то что ты говоришь можно решить способом когда предварительно ты сам обрабатываешь входящую информацию с АТС, т.е. связка: АТС -> промежуточный модуль для обработки и преобразования данных из АТС -> БД (в хорошем виде (кож города, номер телефона) порезанные друг от друга.) но проблема все равно остается т.к. номер телефона поступающий с АТС имеет вид 8Р09536665989 (Москва+36665989). Т.е. надо как-то "выделять" код города. Как я писал в своем первом письме, я это проделываю с помощью хранимой процедуры включающей в себя 3 подзапроса, и хотелось бы увидеть ваше решение подобной проблемы . И чтобы не быть голословным вот часть лога который необходимо преобразовать
Date Time Ext CO Dial Number Ring Duration Acc code CD
--------------------------------------------------------------------------------
11/15/02 04:21PM 112 06 8PP24250791 00:00"04
11/15/02 04:22PM 112 06 8PP24250791 00:00"04
11/15/02 04:22PM 111 03 345953 00:00"13
← →
Sergey13 (2003-05-05 11:09) [9]2Vmarchenko (05.05.03 10:47)
>я это проделываю с помощью хранимой процедуры включающей в себя 3 подзапроса
Ну дак проделываешь же. Что тебе мешает писать в БД уже разобранные код и номер отдельно?
← →
Zacho (2003-05-05 11:46) [10]
> Vmarchenko (05.05.03 10:47)
По поводу хранения данных в БД. Я думаю, что все-таки должна быть "чистая" таблица с уже обработанными данными (код и номер в разных полях) а когда именно их обрабатывать - на этапе заливки лога в БД или заливать лог без разбора в специальную "грязную" таблицу, а потом переносить из нее данные в "чистую" - большой разницы нет, делай как удобнее. Другое дело, что вся последующая работа должна вестись именно с этой "чистой" таблицей - будет гораздо меньше проблем.
Проблема действительно в том, как отделить код от номера. Насколько я понял в самом логе никакого разделителя нет. Я не очень разбираюсь в структуре кодов межгорода, но у меня сразу возник вопрос: не может ли быть ситуации, когда в разных городах длина кода разная, но при этом начало совпадает ? Например, 555 и 5552 ? Как в таком случае отделить код от номера ? Точне, как выяснить к какому городу относится "полный" номер (с кодом) ?
А возможное решение одним запросом уже привел Соловьев (30.04.03 10:36)
← →
Vmarchenko (2003-05-05 14:01) [11]2Sergey13 (05.05.03 11:09)
Я просто хотел увидеть другое решение проблемы. И я ее увидел, пусть в другом ракурсе. ;)
2Zacho (05.05.03 11:46)
По поводу распознования кода города. Распознование проводится на основе справочника кодов городов. И они (уникальны). Но в случае когда кода города в справочнике нет, тогда как раз и может (хотя сам и сомневаюсь) не распознать город. Проводил эксперименты на разных городах и странах, вроде не наблюдал подобной проблемы.
2All. Всем огромное спасибо за принятые дебаты в разбирательтве моего вопроса. Приму ваши пожелания и посмотрю на это с другой точки зрения.
← →
Zacho (2003-05-05 17:41) [12]
> Vmarchenko (05.05.03 14:01)
Понятно, что коды уникальны. А если кода в справочнике нет - конечно, не распознает :-). Можно считать это местным звонком или сделать ссылку на специальную запись "неизвестный город" или ... Вариантов много, конкретное решение зависит от особенностей задачи.
Я имел в виду другое. Посмотри в справочнике кодов, не может ли быть такой ситуации:
Например, есть два города.
КОД ГОРОД
123 Мухосранск
1234 Запупинск
И если у тебя в логе окажется телефон 1234567890, то как отделить код от города ? Ведь это может быть 123-4567890 (Мухосранск), а может быть 1234-567890 (Запупинск).
Но главное, что я хотел сказать, - в базе надо хранить нормализованные данные. Неважно, в каком виде они в логе, а при переносе в базу их надо привести хотя бы к первой нормальной форме. Иначе проблем не оберешься.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c