Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.007 c
14-83748
GOOD
2003-05-07 03:04
2003.05.26
Как вы относитесь к Садаму Хусейну, и его правлению ?


1-83489
Vick
2003-05-15 13:13
2003.05.26
Запись цвета в поток


3-83342
AleksandrKu
2003-05-04 09:03
2003.05.26
как открыть ДБ с разрушившимся индексом


1-83494
MegaVolt
2003-05-14 11:40
2003.05.26
Как правильно добавлять данные в StringGrid?


3-83411
Avreliy
2003-05-06 18:34
2003.05.26
DBLookupComboBox и DBCtrlGrid в Д7!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский