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

Вниз

Помогите разобраться в запросе 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.054 c
3-68234
nedefan
2003-07-26 13:52
2003.08.21
ADOQuery не могу передать параметры


4-68578
Igor__
2003-06-15 23:04
2003.08.21
Иконки в XP


1-68340
Alexey
2003-08-08 15:23
2003.08.21
Кодировка


14-68455
Pat
2003-08-02 23:17
2003.08.21
Ура!! Сегодня женился... :)


14-68537
Yanis
2003-08-02 18:36
2003.08.21
Шахматные игры





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