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

Вниз

помогите написать запрос и организовать работу с 2-мя таблицами   Найти похожие ветки 

 
Борис   (2002-12-15 13:35) [0]

Здравствуйте! Прошу помочь организовать такую связку двух таблиц:
Дано: две таблицы

Таблица 1:
Ключ|Поле1

Таблица 2:
Ключ|Поле1|Поле2

Необходимо вывести в DBGrid
Вывести Таблица1.Ключ, Таблица1.Поле1, вывести значения Таблица2.Поле2 при том, что Таблица1.ключ = Таблица2.Поле1, а если такового нет, вывести 0.

Пример:
Таблица 1:
Ключ|Поле1|
2 1
3 8
4 6

Таблица 2:
Ключ|Поле1|Поле2|
1 1 5
2 2 9


Должно выглядить так:
2 1 1
3 8 0 // В таблице 2 нет поля1 со значением 3 выводим 0
4 6 0 // В таблице 2 нет поля1 со значением 4 значит выводим 0

Так самое главное, как сделать, что если в в таблице2.поле1 небыло подходящего значения, а в DBGrid изменили 0 на что-то, то добавить строчку в Таблица2.

Сказал сложно, но пытался выразить задачу, как мог.

Можно-ли вообще такое сделать???


 
@andrew   (2002-12-15 13:54) [1]

Помоему ты все перепутал
но я думаю, что ты имел ввиду:
select table1.key, table1.pole1, table2.pole2 from table1
left join table2 on table2.key = table1.pole

Нет, не то?


 
@andrew   (2002-12-15 13:55) [2]

А да, надо подставить ноль, тогда вместо
table2.pole2 - isNULL(table2.pole2, 0)


 
Борис   (2002-12-15 13:56) [3]

@andrew
Вы бесспорно правы!
Вот вывели мы это, а как теперь сделать что если в в таблице2.поле1 небыло подходящего значения, а в DBGrid пользователь изменили 0 на что-то, то добавить данную строчку в Таблица2


 
@andrew   (2002-12-15 13:59) [4]

Опять очепятка! isNULL(table2.pole2, 0) AS имя поля, напр. pole2

Хотя смысла в этом запросе, помоему, нет :-) Ты точно написал то, что хотел :?)).


 
Борис   (2002-12-15 14:08) [5]

@andrew
Надо писать местный склад, где в первой таблице описания элементов, а в других таблицах иные значения.


 
@andrew   (2002-12-15 14:14) [6]

Я не знаю - надо думать, но вот один момент: я так понимаю, что таблицы со всязью один-к-одному, иначе все кординально меняетя, а если так - то зачем две таблицы? Ну ладно, надо-значит надо. Хотя если бы было по подробней, то может и решили бы...


 
Борис   (2002-12-15 14:19) [7]

@andrew Действительно сейчас это все в одной таблице, но получатеся так, что надо сделать в нескольких (а то получается очень много полей, сейчас уже невлазеем в 255).


 
@andrew   (2002-12-15 14:30) [8]

Если ты не хочешь делать отдельную форму для редактирования, а пользоваться стандартными компонентами есть такой вариант:
Ты с ADO работаешь? Ну даже если и нет, думаю все будет o.k.
1. пишешь запрос, потом открываешь редактор полей и добавляешь все поля
2. "этим" :-) полям будет по умолчанию флаг readonly, меняшь его на false и обрабатываешь событие onChange, а лучше даже on SetText, где и генеришь запрос по добавлению нужной строки.
3. делаешь Requery.
Что не понял спрашивай. Желаю удачи.


 
Борис   (2002-12-16 10:11) [9]

Запрос сделал. Теперь такой вопрос.
сейчас выбираются все записи из первой таблицы и только те записи из второй, у которых Поле1=Первичному ключу первой таблицы.

select t2.PKey, t1.Pole1, t2.Pole2
from "table1.db" t1 LEFT JOIN "table2.db" t2 ON t1.PKey = t2.Pole1

Сейчас в UpdateSQL написано такой запрос на изменение:

update "table2.db"
set
Pole2 = :Pole2
where
PKey = :OLD_PKey

Но вот возникает проблема, когда мы ставим значение в столбце2 второй таблицы, а фактически-то этой строчки в таблице2 НЕТ (!) (т.к. мы выбирали все из первой и только по условию из второй).

Можно-ли написать запрос в UpdateSQL, что если Pkey нет, то тогда делать Insert, а не Update?


 
Борис   (2002-12-16 11:00) [10]

А может все делается гораздо проще?
Что, если воспользоваться Foreign key ?
как я понимаю, он сможет создать для каждой записи Таблица1.Ключ поле Таблица2.Поле1?



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

Форум: "Базы";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
1-24917
ScableR
2002-12-19 14:22
2003.01.09
Как Работа с RAR или ZIP`ом


6-24995
Kon2002
2002-11-07 19:13
2003.01.09
WinXP


14-25093
Cobalt
2002-12-21 14:31
2003.01.09
Кто юзает Оперу, подскажите - забыл, где это делается


14-25040
OlDemon
2002-12-20 07:12
2003.01.09
Сайт по VBA


4-25130
msts
2002-11-20 15:29
2003.01.09
Перехват вызова функции/внедрение кода





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