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

Вниз

связанные таблицы   Найти похожие ветки 

 
Женя   (2010-03-12 03:19) [0]

Всем доброй ночи! Помогите пожалуйста новичку решить проблему. Проблема следующая: пытаюсь связать две таблицы с помощью query но неполучается. сам запрос следующий:
select *
from CKBI,telephone
where keylink=key1

Связь в таблицах вообще отсутствует, тоесть таблица с ключевым полем keylink выдает абсолютно все игнорируя условие. Может я что не так делаю? Пожалуйста помогите, заранее благодарен!


 
Ega23 ©   (2010-03-12 07:06) [1]

http://citforum.ru/database/sqlbook/sqlbook_06.shtml#332


 
Sergey13 ©   (2010-03-12 09:11) [2]

> [0] Женя   (12.03.10 03:19)
> Может я что не так делаю?

Кто ж тебе это скажет? Ты же не дал никакой исходной информации. Ни СУБД, ни структуры таблиц. Синтаксис запроса вроде нормальный.


 
Женя   (2010-03-12 10:57) [3]

типы полей следующие:
В таблице CKBI следующие поля: key1(счетчик,ключ.поле), name(строка),surn(строка),patr(строка),num_pos(строка),date(дата),pos(строка),vz v(число),pid(число)
В таблице telephone следующие поля:key_tlf(счетчик, ключ.поле),keylink(число),dom(строка),mob(строка),rab(строка)
keylink- числовое поле в таблице telephone
key1- счетчик, ключевое поле в таблице CKBI
По идее tlfquery(в котором прописан сам запрос) должен фильтровать данные полей mob,dom,rab
Почему не связываются, сам не пойму, компилятор никаких ошибок не выдает, он просто вроде как игнорирует запись (показывает все поля таблицы telephone не зависимо от выбраной строки CKBI)

where keylink=key1

причем пробовал уже и полностью прописывать имя типа:

where telephone.keylink=CKBI.key1

База данных - Access(с паролем)


 
MonoLife ©   (2010-03-12 11:03) [4]

telephone - если ранее была фильтрация приравняй в false


 
Ega23 ©   (2010-03-12 11:07) [5]

Это к вопросу о применении звёздочи в селекте.


 
Amir   (2010-03-12 11:35) [6]

>Sergey13 ©   (12.03.10 09:11) [2]
>Синтаксис запроса вроде нормальный.

Если запрос прожуется сервером, это еще не значит, что синтаксис нормальный
В данном случае он какой-то занзибарский, т.к. из него абсолютно ничего не ясно -
ни что извлекается из таблиц, ни что с чем сравнивается в условии
Автор очевидно не слышал про алиасы.


 
Плохиш ©   (2010-03-12 11:43) [7]


> Женя   (12.03.10 03:19)  


> where keylink=key1

Каждая запись будет состоять из полей записей обоих таблиц удовлетворяющих условию

> Женя   (12.03.10 10:57) [3]


> По идее tlfquery(в котором прописан сам запрос) должен фильтровать
> данные полей mob,dom,rab

Ваши идеи разработчиков баз данных как-то совершенно не волнуют. Странно, не правда ли?


 
Sergey13 ©   (2010-03-12 12:05) [8]

> [6] Amir   (12.03.10 11:35)
> В данном случае он какой-то занзибарский

То, что запрос написан не красиво еще не говорит, что он написан неправильно.
Имена полей не пересекаются, значит алиасы формально ни к чему.

> [3] Женя   (12.03.10 10:57)
> По идее tlfquery(в котором прописан сам запрос) должен фильтровать
> данные полей mob,dom,rab

Что значит "фильтровать данные полей mob,dom,rab"?
По запросу должен вернуться набор данных, содержаший все поля обеих таблиц, для записей у которых keylink одной таблицы соответствует key1 другой.
Что тебя не устраивает?


 
Женя   (2010-03-12 12:12) [9]

СУБД следующая:

CKBI.mdb-connection->

CKBIquery(SQL=Select * from CKBI)->CKBIsource (DataSet= CKBIquery)

tlfquery("DataSource=CKBISource",SQL=select * from telephone,CKBI WHERE telephone.keylink like CKBI.key1)->tlfsource("DataSet=tlfquery")


> telephone - если ранее была фильтрация приравняй в false
все постоянно выделяется звездочкой, а в опциях самих полей я делаю их невидимыми


 
Amir   (2010-03-12 12:12) [10]

>Sergey13 ©   (12.03.10 12:05) [8]
>То, что запрос написан не красиво еще не говорит, что он написан неправильно.
>Имена полей не пересекаются, значит алиасы формально ни к чему.

Писателей, которых невозможно читать, следует расстреливать методом обезглавливания через утопление на медленном огне


 
Плохиш ©   (2010-03-12 12:16) [11]


> Женя   (12.03.10 12:12) [9]

И как это вяжется с запросом из > Женя   (12.03.10 03:19)  


 
Женя   (2010-03-12 12:20) [12]

Прошу прощение за возможно глупый вопрос,но что подразумевается под алиасом?


 
Sergey13 ©   (2010-03-12 12:23) [13]

> [9] Женя   (12.03.10 12:12)
> WHERE telephone.keylink like CKBI.key1

Это как? Число похоже на другое?

> [10] Amir   (12.03.10 12:12)

Что из запроса
> [0] Женя   (12.03.10 03:19)
тебе не понятно?


 
Ega23 ©   (2010-03-12 12:30) [14]

Ещё раз, в Select * from уберите звёздочку. Либо у ней алиас таблицы поставьте.


 
Женя   (2010-03-12 12:36) [15]


> Sergey13 ©   (12.03.10 12:23) [13]

> Это как? Число похоже на другое?

WHERE telephone.keylink = CKBI.key1
Да, при совпадении числа поля key1 с полем keylink, я так понимаю должно выдать все строки где поле telephone.keylink = CKBI.key1. Если ошибаюсь, то подскажите пожалуйста как сделать правильно, и подскажите пожалуйста, как красиво писать код?


 
Плохиш ©   (2010-03-12 12:38) [16]


> Женя   (12.03.10 12:36) [15]

goto [7]


 
Sergey13 ©   (2010-03-12 13:04) [17]

> [15] Женя   (12.03.10 12:36)
> я так понимаю должно выдать все строки где поле telephone.keylink = CKBI.key1
Должно выдать произведение (количественно) всех записей одной таблицы и всех другой. Т.е. если в каждой таблице есть 1 запись с key1=1, а в другой 10 записей с keylink=1, то выдаст 10 (10*1) записей в результирующем наборе при WHERE telephone.keylink = CKBI.key1.


 
Anatoly Podgoretsky ©   (2010-03-12 13:35) [18]

> Женя  (12.03.2010 12:20:12)  [12]

Под алиасом понимается псевдоним, просто не переведено.


 
Женя   (2010-03-12 13:51) [19]


> Sergey13 ©   (12.03.10 13:04) [17]

а что нужно прописать, чтобы выдало не произведение, а например если курсор в CKBIquery указывает на строку где key1=1(при условии что 1 - индекс который не повторяется), то выдало в соседнем гриде все строки где поле keylink=1 (компонента tlfquery)?


 
Плохиш ©   (2010-03-12 14:01) [20]


> Женя   (12.03.10 13:51) [19]
>
>

В вашей методичке это раздел, в названии которого упоминаются слова Master/Detail.


 
Sergey13 ©   (2010-03-12 14:03) [21]

> [19] Женя   (12.03.10 13:51)

так и надо сказать ему WHERE telephone.keylink =1

Ты бы задачу лучше описал свою. А то чувствуется, что ты не понимешь что делаешь.


 
Женя   (2010-03-12 14:17) [22]


> Sergey13 ©   (12.03.10 14:03) [21]

В таблице CKBI (ключевое поле key1,  счетчик) хранятся данные людей (ФИО, год рожденья, и т.д.). Но поскольку номеров телефонов у одного человека может быть несколько, я создаю еще одну таблицу telephone, где в строки поля keylink прописываю соответствующие значения поля key1, для осуществления фильтрации номеров текущего человека с индексом key1. И затем хочу отобразить эти данные с помощью двух гридов. Тоесть например при переключении абонента в левом гриде, в правом отображались номера его телефонов


 
Женя   (2010-03-12 14:21) [23]


> Плохиш ©   (12.03.10 14:01) [20]

Что за методичку вы имеете ввиду?


 
Sergey13 ©   (2010-03-12 14:43) [24]

> [22] Женя   (12.03.10 14:17)

Тогда запрос должен быть такой
tlfquery("DataSource=CKBISource",SQL=select * from telephone WHERE keylink=:keylink)->tlfsource("DataSet=tlfquery")


 
Anatoly Podgoretsky ©   (2010-03-12 14:45) [25]

> Sergey13  (12.03.2010 14:03:21)  [21]

А ему понимать не надо, ему надо выполнить задание.


 
Женя   (2010-03-12 15:30) [26]


> Anatoly Podgoretsky ©   (12.03.10 14:45) [25]

Обьясняю, если бы я не хотел понимать что делаю, то разве не проще бы было это сделать заменив компонент query  на компонент table, где кстати все прекрасно работало!
> Sergey13 ©   (12.03.10 14:43) [24]

Обьясните пожалуйста строку:
SQL=select * from telephone WHERE keylink=:keylink
я так понимаю что keylink - переменная, но каким образом в нее передается какое либо значение поля key1? Или этой переменной нужно присваивать значение уже в ходе программы, с помощью команды:
tlfQuery.Parameters.ParamByName("keylink").Value:=CKBIQuery.FieldValues["key1"];


 
Sergey13 ©   (2010-03-12 15:56) [27]

> [26] Женя   (12.03.10 15:30)

:keylink - это параметр, который по идее должен заполняться значением ключевого поля из материнского датасета, который привязан к датасорсу, который у тебя CKBISource. Это мастер-детальное связывание таблиц.
Если материнский датасорс не указывать, то можно в принципе сделать это руками, повесив на событие афтерскролл материнского датасета присваивание значения этому параметру и переоткрытие дочернего датасета.
Не понял - у тебя заработало или нет?


 
Женя   (2010-03-12 16:28) [28]

Да, все получилось, огромное спасибо! Еще одна просьба, не мог бы ты сбросить ссылки на тему  мастер-детальное связывание таблиц. Я имею ввиду доступные для понимания простым смертным))


 
Sergey13 ©   (2010-03-12 16:44) [29]

> [28] Женя   (12.03.10 16:28)
> Еще одна просьба, не мог бы ты сбросить ссылки на тему мастер-детальное связывание таблиц.

Легко.

http://www.google.ru/

8-)


 
Женя   (2010-03-12 18:30) [30]

Спасибо))))))))))))



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

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

Наверх





Память: 0.52 MB
Время: 0.064 c
6-1218807638
_koha
2008-08-15 17:40
2010.08.27
Падает сокет усервера на WinAPI - не могу разобраться


2-1271829332
vegarulez
2010-04-21 09:55
2010.08.27
Как в KaZip`е корректно работать с русскими названиями файлов?


4-1233081707
avi9526
2009-01-27 21:41
2010.08.27
Как получить доступ к скрытому за окном изображению?


15-1270469035
newbe
2010-04-05 16:03
2010.08.27
компиляция длл не в delphi


2-1274084890
REX
2010-05-17 12:28
2010.08.27
метод ExecSQL (компонент ADOQuery)





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