Не идет запрос на удаление, вылазит ошибка, плз хелп!

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, а Апрель (я там опечталася, но это не суть..)
ё
Дата: 25.11.2009 18:00:52
cyberpavel

табличка называется не Апрель2, а Апрель (я там опечталася, но это не суть..)

нифига себе - не суть
cyberpavel

Смысл задачи такой - нужно удалить из таблички Апрель 2 все строки, значения которых полностью повторяются в полях: ЛН, ФИО, Счет, Шифр подразделения, Шифр профессии, Шифр ВО с этими же полями в табличке "Ян-Фев-Март".

так попробуйте
DELETE Апрель.*
FROM [Ян-Фев-Март] 
INNER JOIN Апрель 
ON ([Ян-Фев-Март].ЛН = Апрель.ЛН) 
AND ([Ян-Фев-Март].ФИО = Апрель.ФИО) 
AND ([Ян-Фев-Март].Счет = Апрель.Счет) 
AND ([Ян-Фев-Март].[Шифр подразделения] = Апрель.[Шифр подразделения]) 
AND ([Ян-Фев-Март].[Шифр профессии] = Апрель.[Шифр профессии]) 
AND ([Ян-Фев-Март].[Шифр ВО] = Апрель.[Шифр ВО])
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, с контролем целостности?
qwrqwr
Дата: 26.11.2009 12:53:14
cyberpavel

Смысл задачи такой - нужно удалить из таблички Апрель 2 все строки, значения которых полностью повторяются в полях: ЛН, ФИО, Счет, Шифр подразделения, Шифр профессии, Шифр ВО с этими же полями в табличке "Ян-Фев-Март".
Гм... :)
DELETE DISTINCTROW Апрель.*
 FROM Апрель 
INNER JOIN ЯнФевМарт 
   ON  Апрель.[Шифр ВО] = ЯнФевМарт.[Шифр ВО]
   AND Апрель.[Шифр профессии] = ЯнФевМарт.[Шифр профессии]
   AND Апрель.[Шифр подразделения] = ЯнФевМарт.[Шифр подразделения]
   AND Апрель.Счет = ЯнФевМарт.Счет 
   AND Апрель.ФИО = ЯнФевМарт.ФИО
   AND Апрель.ЛН = ЯнФевМарт.ЛН
cyberpavel
Дата: 26.11.2009 20:47:27
qwrqwr
cyberpavel

Смысл задачи такой - нужно удалить из таблички Апрель 2 все строки, значения которых полностью повторяются в полях: ЛН, ФИО, Счет, Шифр подразделения, Шифр профессии, Шифр ВО с этими же полями в табличке "Ян-Фев-Март".
Гм... :)
DELETE DISTINCTROW Апрель.*
 FROM Апрель 
INNER JOIN ЯнФевМарт 
   ON  Апрель.[Шифр ВО] = ЯнФевМарт.[Шифр ВО]
   AND Апрель.[Шифр профессии] = ЯнФевМарт.[Шифр профессии]
   AND Апрель.[Шифр подразделения] = ЯнФевМарт.[Шифр подразделения]
   AND Апрель.Счет = ЯнФевМарт.Счет 
   AND Апрель.ФИО = ЯнФевМарт.ФИО
   AND Апрель.ЛН = ЯнФевМарт.ЛН


О великий! Ты сотворил чудо! DISTINCTROW - магическое слово, которое выполнило запрос в считанные секунды, в отличие от предыдущего варианта!!!

СПАСИБО, qwrqwr!!!