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

Откуда:
Сообщений: 1197
Привет

Что-то не пойму почему не работает удаление.
Задача оставить в @allStores магазины которые есть @storesToFind.
с LEFT JOIN работает. Хочу понять что не так здесь?

declare  @storesToFind table(store varchar(30))
declare  @allStores table(store varchar(30))

insert @storesToFind select 'A'

insert @allStores select 'A'
insert @allStores select 'B'
insert @allStores select 'C'


delete sf from @allStores a 
    right join @storesToFind sf
	 on a.store = sf.store
	where a.store is null

select * from @allstores
29 окт 13, 15:00    [15046878]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11620
@storesToFind sf
29 окт 13, 15:02    [15046896]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
что удаляете-то?
Guest
relief
Привет

Что-то не пойму почему не работает удаление.
Задача оставить в @allStores магазины которые есть @storesToFind.
с LEFT JOIN работает. Хочу понять что не так здесь?

declare  @storesToFind table(store varchar(30))
declare  @allStores table(store varchar(30))

insert @storesToFind select 'A'

insert @allStores select 'A'
insert @allStores select 'B'
insert @allStores select 'C'


delete sf from @allStores a 
    right join @storesToFind sf
	 on a.store = sf.store
	where a.store is null

select * from @allstores
29 окт 13, 15:04    [15046909]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Konst_One
@storesToFind sf


delete [b]a[/b] from @allStores a 
    right join @storesToFind sf
	 on a.store = sf.store
where a.store is null


не помогло
29 окт 13, 15:06    [15046931]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
aleks2
Guest
relief
Konst_One
@storesToFind sf


delete [b]a[/b] from @allStores a 
    right join @storesToFind sf
	 on a.store = sf.store
where a.store is null


не помогло


Мученик, выполни

select * from @allStores a 
    right join @storesToFind sf
	 on a.store = sf.store
where a.store is null


и умойся слезами.
29 окт 13, 15:08    [15046951]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
aleks2
relief
пропущено...


delete [b]a[/b] from @allStores a 
    right join @storesToFind sf
	 on a.store = sf.store
where a.store is null


не помогло


Мученик, выполни

select * from @allStores a 
    right join @storesToFind sf
	 on a.store = sf.store
where a.store is null


и умойся слезами.


Умылся.

а почему ничего нет в селекте? по А же есть совпадение
29 окт 13, 15:14    [15047006]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11620
where a.store is null
29 окт 13, 15:14    [15047016]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Konst_One
where a.store is null


и? как в итоге написать delete c right join?
29 окт 13, 15:49    [15047336]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11620
зачем?
29 окт 13, 15:52    [15047366]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Konst_One
зачем?


хочу понять, что я не так сделал.
повторю с лефт джойном я сделал задачу
29 окт 13, 15:55    [15047389]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
right join
Guest
relief
Konst_One
зачем?


хочу понять, что я не так сделал.
повторю с лефт джойном я сделал задачу

left join = right join + перестановка таблиц местами
29 окт 13, 15:57    [15047410]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11620
declare  @storesToFind table(store varchar(30))
declare  @allStores table(store varchar(30))

insert @storesToFind select 'A'

insert @allStores select 'A'
insert @allStores select 'B'
insert @allStores select 'C'


delete A from @allStores A 
where A.store <> ALL(select store from @storesToFind)


select * from @allStores



+ ещё много других вариантов есть
29 окт 13, 15:58    [15047424]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Гость333
Member

Откуда:
Сообщений: 3683
relief
как в итоге написать delete c right join?

Зачем тут вообще outer join, не понимаю.
delete a
from @allStores a 
     inner join @storesToFind sf on a.store = sf.store

А покажите ваш запрос с left join?
29 окт 13, 16:00    [15047443]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
relief
как в итоге написать delete c right join?

Зачем тут вообще outer join, не понимаю.
delete a
from @allStores a 
     inner join @storesToFind sf on a.store = sf.store

А покажите ваш запрос с left join?

Упс, задачу не так прочёл :)
29 окт 13, 16:01    [15047447]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Konst_One
declare  @storesToFind table(store varchar(30))
declare  @allStores table(store varchar(30))

insert @storesToFind select 'A'

insert @allStores select 'A'
insert @allStores select 'B'
insert @allStores select 'C'


delete A from @allStores A 
where A.store <> ALL(select store from @storesToFind)


select * from @allStores



+ ещё много других вариантов есть


прикол!
а почему в delete нельзя писать right join?
29 окт 13, 16:02    [15047465]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Вот вариант с right join:
delete a
from @storesToFind sf
     right join @allStores a on a.store = sf.store
where sf.store is null

Получен из left join перестановкой таблиц.
29 окт 13, 16:03    [15047481]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11620
http://technet.microsoft.com/en-us/library/bb510625.aspx

merge посмотрите
29 окт 13, 16:05    [15047495]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11620
вот так в вашем изначальном варианте можно:

delete a from @allStores a right outer join @storesToFind sf
	 on a.store <> sf.store
29 окт 13, 16:14    [15047562]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Извиняюсь, я не понял, вы из какой таблицы данные хотите удалить и по какому условию?

ИМХО: с помощью лефт/райт удалять вообще моветон.
Вот у вас и возникли непонятки.

Гораздо проще и понятнее использовать "In" или "Not In"
delete a from @allStores as a
WHERE a.store in (SELECT sf.store FROM @storesToFind as sf)

delete a from @allStores as a
WHERE a.store not in (SELECT sf.store FROM @storesToFind as sf)
30 окт 13, 06:30    [15050134]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SandalTree
ИМХО: с помощью лефт/райт удалять вообще моветон.
Не пугайте зря людей. И тем более в новых версия уже SEMI работает, как я помню.
SandalTree
Гораздо проще и понятнее использовать "In" или "Not In"
А вот так юзать IN - моветон. Юзайте вместо этого EXISTS

- Или кто-то продолжает троллить.
30 окт 13, 15:39    [15053537]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
relief
а почему в delete нельзя писать right join?
Можно, просто вы запросы писать не умеете вааще.
DECLARE @allStores	TABLE(store NVarChar(32) NULL)
DECLARE @storesToFind	TABLE(store NVarChar(32) NULL)

INSERT	@allStores	VALUES ('A'),('B'),('C')
INSERT	@storesToFind	VALUES ('A')

DELETE	B
OUTPUT	deleted.*
FROM	@storesToFind	A RIGHT
JOIN	@allStores	B ON B.store = A.store
WHERE	A.store IS NULL

SELECT	*
FROM	@allStores

DELETE	B
OUTPUT	deleted.*
FROM	@storesToFind	A RIGHT
JOIN	@allStores	B ON B.store = A.store
WHERE	A.store IS NULL
Всё прекрасно работает.

А вариант с Еxists (и похожими) тут работает лучше
DELETE	B
OUTPUT	deleted.*
FROM	@allStores	B
WHERE	NOT Exists(SELECT * FROM @storesToFind A WHERE A.store = B.store)
Но главное смысл читается нормально.

<> ALL - синтаксический сахар. При хорошем оптимизаторе только и является.
30 окт 13, 17:05    [15054369]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Второй DELETE в первом батче случайно попал, не обращайте внимания.
30 окт 13, 17:07    [15054394]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
SandalTree
ИМХО: с помощью лефт/райт удалять вообще моветон.
Не пугайте зря людей. И тем более в новых версия уже SEMI работает, как я помню.
SandalTree
Гораздо проще и понятнее использовать "In" или "Not In"
А вот так юзать IN - моветон. Юзайте вместо этого EXISTS

- Или кто-то продолжает троллить.


Спасибо, действительно NOT EXISTS работает быстрее чем NOT IN.
Не знал или забыл. Теперь запомню.

Не ожидал что планировщик может запутаться в столь тривиальном плане.


В своё оправданье скажу только что простой IN работает не хуже EXISTSа, а синтаксис проще.
1 ноя 13, 01:29    [15062077]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
точно, троллит
Guest
SandalTree
Не ожидал что планировщик может запутаться в столь тривиальном плане.


под планировщиком уважаемый понимает оптимизатор???
вот уж точно, "японский кому-то неродной"
1 ноя 13, 02:07    [15062139]     Ответить | Цитировать Сообщить модератору
 Re: DELETE + RIGHT JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SandalTree
Не ожидал что планировщик может запутаться в столь тривиальном плане.
Ну вообще-то это разные запросы по семантике.
Вы вообще слышали о (Anti-)Semi-Join?

Некоторые могут читать IN как - означает, верни данные (засунь их в буфера данных) из одного запроса и передай другому.
Exists - проверь что (не) существует хотя бы одно строка, но при этом ничего не возвращай.
Вообще наоборот "читается" запрос. (императивистами)

А то что у вас разные планы - это у вас сервер старой версии.

SandalTree
В своё оправданье скажу только что простой IN работает не хуже EXISTSа, а синтаксис проще.

Проще? Длинее да, но не проще. Запрос читается как на родном.

Особенно когда начинается свистопляска с NOT IN и NULL значениями, проще точно не становится.

А вот что быстрее работает (если исключить разную семантику) - в старых версиях зависит от задачи.
1 ноя 13, 12:24    [15063853]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить