Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
NIon
Member

Откуда: Russia
Сообщений: 141
Вот запрос :
		DELETE  FROM shopInfo_Test 
		FROM shopInfo_Test AS st 
				INNER JOIN 
				(SELECT CurrDate,s.kodt AS kodt 
				 FROM shopWork sw INNER JOIN shops s ON sw.shopID=s.shopID   
				 WHERE (Remark IS NOT NULL) AND (currdate>=@GlubinaZagruzki)) t
				ON ((st.CurrDate<>t.CurrDate) AND (st.kodt<>t.kodt) )
		WHERE (st.currdate>=@GlubinaZagruzki) 

Запрос почему то удаляет все данные из таблицы shopInfo_Test .
А нужно только те , для которых в другой таблице shopWork выполняется условие
WHERE (Remark IS NOT NULL) AND (currdate>=@GlubinaZagruzki) 

при связи по
ON ((st.CurrDate<>t.CurrDate) AND (st.kodt<>t.kodt) )


Что неправильно в запросе ? Или здесь только через курсор ?
Спасибо
6 авг 14, 12:22    [16405812]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
Glory
Member

Откуда:
Сообщений: 104760
NIon
Запрос почему то удаляет все данные из таблицы shopInfo_Test

Наверное потому, что запрос так написан

что выберет ваш запрос
select st.*
FROM shopInfo_Test AS st 
				INNER JOIN 
				(SELECT CurrDate,s.kodt AS kodt 
				 FROM shopWork sw INNER JOIN shops s ON sw.shopID=s.shopID   
				 WHERE (Remark IS NOT NULL) AND (currdate>=@GlubinaZagruzki)) t
				ON ((st.CurrDate<>t.CurrDate) AND (st.kodt<>t.kodt) )
		WHERE (st.currdate>=@GlubinaZagruzki) 
6 авг 14, 12:26    [16405835]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Похоже, Ваш запрос эквивалентен такому:
DELETE st
FROM shopInfo_Test st
JOIN shopWork sw ON st.CurrDate<>sw.CurrDate AND st.kodt<>sw.kodt
JOIN shops s ON sw.shopID=s.shopID
WHERE st.currdate>=@GlubinaZagruzki
  AND sw.Remark IS NOT NULL
  AND sw.currdate>=@GlubinaZagruzki;
Не везде проставлены алиасы, поэтому мне невозможно определить принадлежность некоторых полей.
Вот этот запрос что-нибудь возвращает?
SELECT *
FROM shopInfo_Test st
JOIN shopWork sw ON st.CurrDate<>sw.CurrDate AND st.kodt<>sw.kodt
JOIN shops s ON sw.shopID=s.shopID
WHERE st.currdate>=@GlubinaZagruzki
  AND sw.Remark IS NOT NULL
  AND sw.currdate>=@GlubinaZagruzki;
Вообще, связка по неравенству полей не слишком-то хорошая...
Но раз так надо...
JOIN с shop я могу объяснить только требованием,
что удаляемые записи должны иметь соответствующие строки в shops
6 авг 14, 13:48    [16406441]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
NIon
Member

Откуда: Russia
Сообщений: 141
to (Glory)
Данный select возвращает 23864 записи. Я уже смотрел данный данный селект. По идее , в него не должны попадать те записи , которые я не хочу удалять , а они попадают почему-то - нужно разбираться....

to (iap)
этот запрос , который Вы привели не работает , т.к. понятно почему - у Вас не было полного знания о таблицах.
Таблички вот какие (привожу не все поля , а значащие для нас):

ShopInfo_Test , поля (kodt,CurrDate)

ShopWork , поля (ShopID,CurrDate,Remark)

Shops , поля (ShopID,kodt)

Задача простая -вообще , нужно удалить записи из таблицы ShopInfo_Test , которые не содержат комментария (Remark IS NULL) в связанной таблице ShopWork , связь по (kodt,CurrDate) посредством join табл. Shops , т.к. поля kodt непосредственно в табл.ShopWork нет )
6 авг 14, 15:44    [16407304]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
Glory
Member

Откуда:
Сообщений: 104760
NIon
Данный select возвращает 23864 записи.

Значит столько же и будет удалено.

NIon
По идее , в него не должны попадать те записи , которые я не хочу удалять , а они попадают почему-то - нужно разбираться....

Это точно - разбираться надо

NIon
т.к. поля kodt непосредственно в табл.ShopWork нет )

Такие проверки не делают через ON ((st.kodt<>t.kodt) )
Потому что "не равно" это вовсе не эквивалент "не существует"
6 авг 14, 15:49    [16407342]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
NIon
Member

Откуда: Russia
Сообщений: 141
NIon
т.к. поля kodt непосредственно в табл.ShopWork нет )

Такие проверки не делают через ON ((st.kodt<>t.kodt) )
Потому что "не равно" это вовсе не эквивалент "не существует"[/quot]

А если поменяю на

WHERE (Remark IS NULL)

и
ON ((st.CurrDate=t.CurrDate) AND (st.kodt=t.kodt) )


так тогда должно сработать , если проблема в этом
автор
(Потому что "не равно" это вовсе не эквивалент "не существует")

Сейчас буду пробовать- спасибо...
6 авг 14, 15:58    [16407406]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
mrGuest
Guest
NIon,

Может быть Вам нужно это:
delete	shopInfo_Test
from	shopInfo_Test as st
	left join (
		select	CurrDate,
			s.kodt as kodt
		from	shopWork as sw
			join shops as s on sw.shopID = s.shopID
		where	Remark is not null
			and currdate >= @GlubinaZagruzki
	) as t
	on st.CurrDate = t.CurrDate and st.kodt = t.kodt
where	st.currdate >= @GlubinaZagruzki
	and t.CurrDate is null

delete	shopInfo_Test
from	shopInfo_Test
	left join ShopWork
		join Shops on Shops.ShopID = ShopWork.ShopID and ShopWork.CurrDate >= @GlubinaZagruzki and Remark is not null
	on shopInfo_Test.CurrDate = ShopWork.CurrDate and shopInfo_Test.kodt = Shops.kodt
where	shopInfo_Test.CurrDate >= @GlubinaZagruzki
	and ShopWork.CurrDate is null
6 авг 14, 16:19    [16407616]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
NIon
Задача простая -вообще , нужно удалить записи из таблицы ShopInfo_Test , которые не содержат комментария (Remark IS NULL) в связанной таблице ShopWork
delete sit
from
 ShopInfo_Test sit join
 Shops s on s.kodt = sit.kodt join
 ShopWork sw on sw.ShopID = s.ShopID and sw.CurrDate = sit.CurrDate
where
 sit.CurrDate > @GlubinaZagruzki and
 sw.Remark is null;
6 авг 14, 16:35    [16407737]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
NIon
Member

Откуда: Russia
Сообщений: 141
Всем огромное спасибо , заработало - нужно просто было поменять <> на = , ну и (Remark IS NOT NULL) на (Remark IS NULL).
Вот рабочий код , если кому интересно (см. ниже).
to (invm) Возможно Ваш запрос оптимальнее или короче , спасибо

DELETE  FROM shopInfo_Test 
		FROM shopInfo_Test AS st 
				INNER JOIN 
				(SELECT CurrDate,s.kodt AS kodt 
				 FROM shopWork sw INNER JOIN shops s ON sw.shopID=s.shopID   
				 WHERE (Remark IS NULL) AND (currdate>=@GlubinaZagruzki)) t
				ON ((st.CurrDate=t.CurrDate) AND (st.kodt=t.kodt) )
		WHERE (st.currdate>=@GlubinaZagruzki) 
6 авг 14, 16:44    [16407818]     Ответить | Цитировать Сообщить модератору
 Re: Удаление данных одной таблицы на основании данных другой - удаляет не так как надо...  [new]
mrGuest
Guest
invm
NIon
Задача простая -вообще , нужно удалить записи из таблицы ShopInfo_Test , которые не содержат комментария (Remark IS NULL) в связанной таблице ShopWork
delete sit
from
 ShopInfo_Test sit join
 Shops s on s.kodt = sit.kodt join
 ShopWork sw on sw.ShopID = s.ShopID and sw.CurrDate = sit.CurrDate
where
 sit.CurrDate > @GlubinaZagruzki and
 sw.Remark is null;


А если в таблице ShopInfo_Test будут записи, которые не сопоставились с другими таблицами? Мы об этом не знаем, но может они есть... и может их тоже нужно удалять...
6 авг 14, 17:03    [16407950]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить