Форум: "Базы";
Текущий архив: 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