Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.21;
Скачать: CL | DM;

Вниз

Помогите разобраться в запросе SQL   Найти похожие ветки 

 
-Felan-   (2003-07-28 13:43) [0]

Сделал запрос в Д6 под БДЕ для локальной базы. Суть запроса в том, что бы удалить единственную (естественно они там все уникальны, но поднаборы атрибутов могут повторяться) строку из таблицы sostav_otdelov используюя данные, которые были выведены на основе этой строки. Т.е. есть только Код_Сотрудника, Название_отдела, Название_ставки и Разряд.


DELETE FROM Sostav_Otdelov
WHERE Sostav_Otdelov.Sos_Code=
(
SELECT Sostav_otdelov.Sos_Code
FROM Sostav_Otdelov
WHERE (Sostav_otdelov.Sos_Otdel_Code=:CurOtdel)
And (Sostav_otdelov.Sos_Sotrudnik_Code=:CurSotrudnik)
And (Sostav_otdelov.Sos_Razryad=:CurRazryad)
And (Sostav_otdelov.Sos_Stavka_Code="
(
SELECT Stavki.S_Code
FROM Stavki
WHERE UPPER(TRIM(Stavki.S_Name))=UPPER(TRIM(:CurStavka))
))
And (Sostav_otdelov.Sos_Dolgnost_Code=
(
SELECT Dolgnosti.D_Code
FROM Dolgnosti
WHERE UPPER(TRIM(Dolgnosti.D_Name))=UPPER(TRIM(:CurDolgnost))
( So_Code) Сделал запрос в Д6 под БДЕ для локальной базы. Суть запроса в том, что бы удалить единственную (естественно они там все уникальны, но поднаборы атрибутов могут повторяться) строку из таблицы sostav_otdelov используюя данные, которые были выведены на основе этой строки. Т.е. есть только Код_Сотрудника, Название_отдела, Название_ставки и Разряд.


DELETE FROM Sostav_Otdelov
WHERE Sostav_Otdelov.Sos_Code=
(
SELECT Sostav_otdelov.Sos_Code
FROM Sostav_Otdelov
WHERE (Sostav_otdelov.Sos_Otdel_Code=:CurOtdel)
And (Sostav_otdelov.Sos_Sotrudnik_Code=:CurSotrudnik)
And (Sostav_otdelov.Sos_Razryad=:CurRazryad)
And (Sostav_otdelov.Sos_Stavka_Code="
(
SELECT Stavki.S_Code
FROM Stavki
WHERE UPPER(TRIM(Stavki.S_Name))=UPPER(TRIM(:CurStavka))
))
And (Sostav_otdelov.Sos_Dolgnost_Code=
(
SELECT Dolgnosti.D_Code
FROM Dolgnosti
WHERE UPPER(TRIM(Dolgnosti.D_Name))=UPPER(TRIM(:CurDolgnost))
))
)

На всякий случай приведу структуру таблиц:

Таблица - Sotrudniki
Код_сотрудника(So_Code) +
Tабельный_номер(S0_Tabel_Num) I
Имя(So_Name) A25
Инициал_Фамилия(So_Family) A1
Инициал_Отчество(So_Otchestvo) A1

Таблица - Sostav_Otdelov
Код_записи(Sos_Code) +
Код_Отдел(Sos_Otdel_Code) I
Код_Сотрудник(Sos_Sotrudnik_Code) I
Код_Должность(Sos_Dolgnost_Code) I
Код_Ставка(Sos_Stavka_Code) I
Разряд(Sos_Razryad) I

Таблица – Otdely
Код_отдела(O_Code) +
Название(O_Name) A60
Аббревиатура(O_Short_Name) A20

Таблица – Dolgnosti
Код_должности(D_Code) +
Название_должности(D_Name) A40
Аббревиатура(D_Short_Name) A15

Таблица – Stavki
Код_ставки(S_Code) +
Название_ставки(S_Name) A30


 
-Felan-   (2003-07-28 13:47) [1]

Блин, забыл написать в чем проблема :)

Проблема в том, что он не работает. Выдает ошибку EDBEngine Error "Could not find object.". Отдельно каждая часть запроса работает правильно! Если заменить параметры на конкретные значения, то все работает.
Я просто даже не представляю в какую сторону копать. Мжоет это ограничения БДЕ какие, или все-таки кривость рук?


 
HSolo ©   (2003-07-28 14:24) [2]

А зачем так сложно? С подзапросами? из подзапросов?
Попробуйте так:
1) получите (отдельными запросами или как...) код должности и код ставки
2) сделайте запрос:
DELETE FROM Sostav_Otdelov
WHERE (Sostav_otdelov.Sos_Otdel_Code=:CurOtdel)
And (Sostav_otdelov.Sos_Sotrudnik_Code=:CurSotrudnik)
And (Sostav_otdelov.Sos_Razryad=:CurRazryad)
And (Sostav_otdelov.Sos_Stavka_Code=:CurStavka)
And (Sostav_otdelov.Sos_Dolgnost_Code=:CurDolgnost)
Должно сработать.
Если же Вам критично, чтобы все это проделать одним запросом - то попробуйте хотя бы так:
DELETE FROM Sostav_Otdelov
WHERE (Sostav_otdelov.Sos_Otdel_Code=:CurOtdel)
And (Sostav_otdelov.Sos_Sotrudnik_Code=:CurSotrudnik)
And (Sostav_otdelov.Sos_Razryad=:CurRazryad)
And (Sostav_otdelov.Sos_Stavka_Code="
(
SELECT Stavki.S_Code
FROM Stavki
WHERE UPPER(TRIM(Stavki.S_Name))=UPPER(TRIM(:CurStavka))
))
And (Sostav_otdelov.Sos_Dolgnost_Code=
(
SELECT Dolgnosti.D_Code
FROM Dolgnosti
( TRIM(Dolgnosti.D_Name) А зачем так сложно? С подзапросами? из подзапросов?
Попробуйте так:
1) получите (отдельными запросами или как...) код должности и код ставки
2) сделайте запрос:
DELETE FROM Sostav_Otdelov
WHERE (Sostav_otdelov.Sos_Otdel_Code=:CurOtdel)
And (Sostav_otdelov.Sos_Sotrudnik_Code=:CurSotrudnik)
And (Sostav_otdelov.Sos_Razryad=:CurRazryad)
And (Sostav_otdelov.Sos_Stavka_Code=:CurStavka)
And (Sostav_otdelov.Sos_Dolgnost_Code=:CurDolgnost)
Должно сработать.
Если же Вам критично, чтобы все это проделать одним запросом - то попробуйте хотя бы так:
DELETE FROM Sostav_Otdelov
WHERE (Sostav_otdelov.Sos_Otdel_Code=:CurOtdel)
And (Sostav_otdelov.Sos_Sotrudnik_Code=:CurSotrudnik)
And (Sostav_otdelov.Sos_Razryad=:CurRazryad)
And (Sostav_otdelov.Sos_Stavka_Code="
(
SELECT Stavki.S_Code
FROM Stavki
WHERE UPPER(TRIM(Stavki.S_Name))=UPPER(TRIM(:CurStavka))
))
And (Sostav_otdelov.Sos_Dolgnost_Code=
(
SELECT Dolgnosti.D_Code
FROM Dolgnosti
WHERE UPPER(TRIM(Dolgnosti.D_Name))=UPPER(TRIM(:CurDolgnost))
))



 
-Felan-   (2003-07-29 10:13) [3]

Да. Было кретично, что бы сделать одним запросом. Твой вариант заработал. Спасибо!

Но, не мог бы ты объяснить, почему не работало по моему? Чтоб я второй раз в эту лужу не сел.


 
Rol   (2003-07-29 10:34) [4]

А так можно?
DELETE FROM Sostav_Otdelov
WHERE Sostav_Otdelov.Sos_Code=
(
SELECT Sostav_otdelov.Sos_Code
FROM
(Sostav_Otdelov so join Stavki s on so.Sos_Stavka_Code=s.S_Code)
join Dolgnosti d on so.Sos_Dolgnost_Code=s.D_Code

WHERE (so.Sos_Otdel_Code=:CurOtdel)
And (so.Sos_Sotrudnik_Code=:CurSotrudnik)
And (so.Sos_Razryad=:CurRazryad)
And UPPER(TRIM(s.S_Name))=UPPER(TRIM(:CurStavka))
And UPPER(TRIM(d.D_Name))=UPPER(TRIM(:CurDolgnost))
)


 
HSolo ©   (2003-07-29 13:29) [5]

"Нутром чую, что пол-литра, но доказать не могу" (с)
Просто Ваш вариант неоправданно усложнен, у Вас получилось - подзапрос из подзапроса. Как реагирует BDE на такие вещи - Борланд его знает :)) видимо, то, что у Вас получилось, это его естественная реакция. Как 2-й раз не сесть в ту же лужу - просто соблюдать принцип KISS (Keep It Simple Stupid). Чем конструкция проще, тем надежнее. IMHO.


 
VAleksey ©   (2003-07-29 14:01) [6]

BDE не поддерживает (к сожалению) использование параметров в подзапросах.



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

Текущий архив: 2003.08.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-68262
Man
2003-08-06 13:21
2003.08.21
защита от несанкционированного копирования


1-68293
alois
2003-08-05 18:55
2003.08.21
Параметры страницы в RichEdit


6-68435
Volly
2003-06-16 15:54
2003.08.21
Считывание данных из сервера


14-68448
HermitAlex
2003-08-04 16:07
2003.08.21
Задача об оптимальном расположении


1-68271
dima74
2003-08-06 20:13
2003.08.21
Вызов метода родителя родителя класса