cyberpavel
Дата: 25.11.2009 17:18:29
Товарисчи, просьба подсказать в чем ошибка... в обоих вариантах запроса вылезает следующий текст ошибки -
"вами создан подчиненный запрос, который может возвращать более одного поля, без использования ключевого слова EXIST в предложении FROM основного запроса. Измените инструкцию SELECT подченного запроса так, чтобы возвращалось только одно поле."
В чем ошибка?
Вариант 1 с использованием связей:
DELETE *
FROM Апрель2
WHERE ЛН in
(SELECT Апрель.ЛН, Апрель.ФИО, Апрель.Счет, Апрель.[Шифр подразделения], Апрель.[Шифр профессии], Апрель.[Шифр ВО], Апрель.Апрель
FROM [Ян-Фев-Март] INNER JOIN Апрель ON ([Ян-Фев-Март].ЛН = Апрель.ЛН) AND ([Ян-Фев-Март].ФИО = Апрель.ФИО) AND ([Ян-Фев-Март].Счет = Апрель.Счет) AND ([Ян-Фев-Март].[Шифр подразделения] = Апрель.[Шифр подразделения]) AND ([Ян-Фев-Март].[Шифр профессии] = Апрель.[Шифр профессии]) AND ([Ян-Фев-Март].[Шифр ВО] = Апрель.[Шифр ВО]));
-----
Вариант 2 без использования связей
DELETE *
FROM Апрель2
WHERE ЛН in
(select ЛН, ФИО, Счет, [Шифр подразделения], [Шифр профессии], [Шифр ВО] from [Ян-Фев-Март]
where Апрель2.ЛН=[Ян-Фев-Март].ЛН and Апрель.ФИО=[Ян-Фев-Март].ФИО and Апрель.Счет=[Ян-Фев-Март].Счет and Апрель.[Шифр подразделения]=[Ян-Фев-Март].[Шифр подразделения] and Апрель.[Шифр профессии]=[Ян-Фев-Март].[Шифр профессии] and Апрель.[Шифр профессии]=[Ян-Фев-Март].[Шифр профессии] and Апрель.[Шифр ВО]=[Ян-Фев-Март].[Шифр ВО]);
Смысл задачи такой - нужно удалить из таблички Апрель 2 все строки, значения которых полностью повторяются в полях: ЛН, ФИО, Счет, Шифр подразделения, Шифр профессии, Шифр ВО с этими же полями в табличке "Ян-Фев-Март".
Структура табл.1: "Ян-Фев-Март"
ЛН, ФИО, Счет, Шифр подразделения, Шифр профессии, Шифр ВО, Январь, Февраль, Март.
Структура табл.2: "Апрель2"
ЛН, ФИО, Счет, Шифр подразделения, Шифр профессии, Шифр ВО, Апрель.
ё
Дата: 25.11.2009 17:32:13
...а что ж вам не понятно??
|
"вами создан подчиненный запрос, который может возвращать более одного поля, без использования ключевого слова EXIST в предложении FROM основного запроса. Измените инструкцию SELECT подченного запроса так, чтобы возвращалось только одно поле." В чем ошибка? |
мало того что говорит в чем ошибка
|
возвращать более одного поля
|
так ещё и решение предлагает)))
автор |
EXISTS или Измените инструкцию SELECT подченного запроса так, чтобы возвращалось только одно поле." |
так что или
DELETE *
FROM Апрель2
WHERE ЛН in
(SELECT Апрель.ЛН
FROM [Ян-Фев-Март] INNER JOIN Апрель ON ([Ян-Фев-Март].ЛН = Апрель.ЛН) AND ([Ян-Фев-Март].ФИО = Апрель.ФИО) AND ([Ян-Фев-Март].Счет = Апрель.Счет) AND ([Ян-Фев-Март].[Шифр подразделения] = Апрель.[Шифр подразделения]) AND ([Ян-Фев-Март].[Шифр профессии] = Апрель.[Шифр профессии]) AND ([Ян-Фев-Март].[Шифр ВО] = Апрель.[Шифр ВО]));
или
DELETE *
FROM Апрель2
WHERE EXISTS
(SELECT Апрель.ЛН, Апрель.ФИО, Апрель.Счет, Апрель.[Шифр подразделения], Апрель.[Шифр профессии], Апрель.[Шифр ВО], Апрель.Апрель
FROM [Ян-Фев-Март] INNER JOIN Апрель ON ([Ян-Фев-Март].ЛН = Апрель.ЛН) AND ([Ян-Фев-Март].ФИО = Апрель.ФИО) AND ([Ян-Фев-Март].Счет = Апрель.Счет) AND ([Ян-Фев-Март].[Шифр подразделения] = Апрель.[Шифр подразделения]) AND ([Ян-Фев-Март].[Шифр профессии] = Апрель.[Шифр профессии]) AND ([Ян-Фев-Март].[Шифр ВО] = Апрель.[Шифр ВО])
WHERE Апрель.ЛН = Апрель2.ЛН);
во втором случае - можно проще
DELETE *
FROM Апрель2
WHERE EXISTS
(SELECT 1
FROM [Ян-Фев-Март] INNER JOIN Апрель ON ([Ян-Фев-Март].ЛН = Апрель.ЛН) AND ([Ян-Фев-Март].ФИО = Апрель.ФИО) AND ([Ян-Фев-Март].Счет = Апрель.Счет) AND ([Ян-Фев-Март].[Шифр подразделения] = Апрель.[Шифр подразделения]) AND ([Ян-Фев-Март].[Шифр профессии] = Апрель.[Шифр профессии]) AND ([Ян-Фев-Март].[Шифр ВО] = Апрель.[Шифр ВО])
WHERE Апрель.ЛН = Апрель2.ЛН);
cyberpavel
Дата: 25.11.2009 17:54:42
ё, Спасибо за ответ!!!
Таким образом запрос получился такой:
DELETE *
FROM Апрель
WHERE exists
(SELECT Апрель.ЛН, Апрель.ФИО, Апрель.Счет, Апрель.[Шифр подразделения], Апрель.[Шифр профессии], Апрель.[Шифр ВО], Апрель.Апрель
FROM [Ян-Фев-Март] INNER JOIN Апрель ON ([Ян-Фев-Март].ЛН = Апрель.ЛН) AND ([Ян-Фев-Март].ФИО = Апрель.ФИО) AND ([Ян-Фев-Март].Счет = Апрель.Счет) AND ([Ян-Фев-Март].[Шифр подразделения] = Апрель.[Шифр подразделения]) AND ([Ян-Фев-Март].[Шифр профессии] = Апрель.[Шифр профессии]) AND ([Ян-Фев-Март].[Шифр ВО] = Апрель.[Шифр ВО]));
Может запрос не верно составлен? Но почему-то этот запрос удаляет все строки из таблицы "Апрель", аналогичный же запрос на выборку удаляет совподающие строки:
SELECT Апрель.ЛН, Апрель.ФИО, Апрель.Счет, Апрель.[Шифр подразделения], Апрель.[Шифр профессии], Апрель.[Шифр ВО], Апрель.Апрель
FROM [Ян-Фев-Март] INNER JOIN Апрель ON ([Ян-Фев-Март].ЛН = Апрель.ЛН) AND ([Ян-Фев-Март].ФИО = Апрель.ФИО) AND ([Ян-Фев-Март].Счет = Апрель.Счет) AND ([Ян-Фев-Март].[Шифр подразделения] = Апрель.[Шифр подразделения]) AND ([Ян-Фев-Март].[Шифр профессии] = Апрель.[Шифр профессии]) AND ([Ян-Фев-Март].[Шифр ВО] = Апрель.[Шифр ВО]);
p.s.: табличка называется не Апрель2, а Апрель (я там опечталася, но это не суть..)
cyberpavel
Дата: 25.11.2009 18:08:15
ё,
вынужден отойти, попробую через 3 часа, спасибо так или иначее..
cyberpavel
Дата: 25.11.2009 18:10:00
cyberpavel,
но судя по тому , что я вижу, он все же решил все строки удалииить....
cyberpavel
Дата: 26.11.2009 00:50:45
ё,
Данный запрос работает в режиме просмотра, но оч. медлееееннно даж на сверхшустром компе, а удалять гад не хочет, говорит - не возможно удаление записей из указанных таблиц...
ё
Дата: 26.11.2009 11:33:44
cyberpavel |
Данный запрос работает в режиме просмотра, но оч. медлееееннно даж на сверхшустром компе, а удалять гад не хочет, говорит - не возможно удаление записей из указанных таблиц... |
ну, насчет медленно открывается - это к делу отношения не имеет
может записей много, да и join по 6-ти полям
(текстовым скорее всего!!) - то же не добавляет скорости
тем более, я так понимаю - вам надо его выполнить один раз
хотя можно сделать на этих табл. индекс по полям
ЛН,ФИО,Счет,[Шифр подразделения],[Шифр профессии],[Шифр ВО]
будет быстрее
а вот то что не может удалять - странно
может - контроль целостности - не дает...?
есть на схеме данных связи таб.Апрель на стороне 1, с контролем целостности?