C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
SQL, исправить запрос
Лена
Отправлено: 04.12.2006, 11:28


Мастер участка

Группа: Участник
Сообщений: 501



Как правильно переписать запрос ниже:
UPDATE keys, visitors SET keys.person_id = NULL WHERE person_id =visitors.id
keys и visitors таблицы. Мне надо записать в колонку person_id значение NULL.

AVC
Отправлено: 04.12.2006, 11:48


Ветеран

Группа: Модератор
Сообщений: 1583



Если правильно понял
Update key Set person_id = Null
Where person_id in (Select id From visitors)
Еще можно воспользоватья exist

Но если вы не пользуетесь "многосвязным" полем person_id ("многосвязное" это когда для разных записей поле ссылается на разные таблицы) то этот запрос равносилен
Update key Set person_id = Null
Другое дело если вы самих визиторов отбираете еще по какому либо критерию.
Лена
Отправлено: 04.12.2006, 13:42


Мастер участка

Группа: Участник
Сообщений: 501



Спасибо! victory.gif
olegenty
Отправлено: 04.12.2006, 13:58


Ветеран

Группа: Модератор
Сообщений: 2412



2 Лена — избегай таких условий при update, либо внимательно вчитывайся в синтаксис update при join
Лена
Отправлено: 04.12.2006, 14:43


Мастер участка

Группа: Участник
Сообщений: 501



Да, вроде разобралась. В моем случае, мне нужно по другому делать:
CODE

//событие BeforeDelete для ClientDataSetVis
//ADOQueryKey привязан к таблице keys
DataModule2->ADOQueryKey->SQL->Add("Update keys Set person_id = Null Where person_id ="+ IntToStr(DataModule2->ClientDataSetVis->FieldByName("id")->AsInteger));
DataModule2->ADOQueryKey->ExecSQL();

В таблице привязанной к ADOQueryKey есть поле person_id. Если удаляется запись из другой таблицы (ClientDataSetVis), то я обнуляю поле person_id в таблице привязанной к ADOQueryKey.

AVC
Отправлено: 04.12.2006, 15:06


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Если удаляется запись из другой таблицы (ClientDataSetVis), то я обнуляю поле person_id в таблице привязанной к ADOQueryKey

А что у PostgreSQL это нельзя записать бизнес правилами (ограничениями, тригерами, правилами для FK ...) прямо на сервере?

Классика — restrict / cascade / set null для дочерних таблиц поддерживают редко а вот для родительских почти всегда (если сервер претендует на звание сервера БД smile.gif )
Лена
Отправлено: 04.12.2006, 15:23


Мастер участка

Группа: Участник
Сообщений: 501



QUOTE (AVC @ 04.12.2006, 15:06)
QUOTE

А что у PostgreSQL это нельзя записать бизнес правилами (ограничениями, тригерами, правилами для FK ...) прямо на сервере?


Да, можно, но я не разробатывала базу. Что либо менять в базе может только другой человек.
Я работаю с готовой базой данных, которую мне дали и этого ограничения там нет, поэтому пришлось через SQL делать. Вроде работает. rolleyes.gif

Отредактировано Лена — 04.12.2006, 15:25
olegenty
Отправлено: 04.12.2006, 16:03


Ветеран

Группа: Модератор
Сообщений: 2412



в MSSQL вот это:
CODE

update some_table set
   some_field = some_value(some_expression)
from
   some_other table
   inner join some_very_other table on some_condition

тоже работает, только результат непредсказуем, надо очень аккуратно блюсти синтаксис smile.gif (первой таблицей в join ОБЯЗАНА быть обновляемая таблица. однако MSSQL этого условия не проверяет. я как-то чуть базу не порушил, перепутав view с таблицей в таком выражении, поскольку их названия отличались только префиксом "v" у view)

Вернуться в Работа с базами данных в C++Builder