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

Откуда:
Сообщений: 1907
Добрый день
чтобы до:

name  surname
n1      s1
n2      s1
n3      s3
n4      s3
n5      s2


а после стало:

name  surname
n1      s1
n3      s3
n5      s2


таблица назывывается man(name - первичный ключ)
15 окт 13, 15:25    [14973695]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
select surname, min(name) as name from man group by surname
15 окт 13, 15:27    [14973725]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Konst_One,

надо изменить содержимое таблички
15 окт 13, 15:29    [14973745]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ну так удали лишнее
15 окт 13, 15:30    [14973757]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Konst_One,

except-ом это оптимально?
15 окт 13, 15:32    [14973779]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
актуальный план выполнения покажет
15 окт 13, 15:34    [14973792]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
with cte
as
(
select row_number() over (partition by surname order by name ) id, * from man
)
delete from cte 
where id > 1
15 окт 13, 15:35    [14973805]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Knyazev Alexey,

это не чистый sql наверное?
15 окт 13, 15:41    [14973859]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
я так написал

delete from man
where name in(
select name from man
except (
select min(name )
from man group by surname)
)
15 окт 13, 15:43    [14973877]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
declare @man table(name varchar(10), surname varchar(10))

insert into @man (name, surname)
select 'n1',      's1' union all 
select 'n2',      's1' union all 
select 'n3',      's3' union all
select 'n4',      's3' union all
select 'n5',      's2'

delete from @man
FROM @man B inner join (select surname, min(name) as name from @man group by surname) A
	ON B.name <> A.name And B.surname = A.surname

select * from @man
15 окт 13, 15:45    [14973897]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
redwhite90
Knyazev Alexey,

это не чистый sql наверное?


а какой? "грязный"?
15 окт 13, 15:48    [14973935]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ну наверное <2005 версии
15 окт 13, 15:49    [14973951]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Glory
Member

Откуда:
Сообщений: 104751
redwhite90
я так написал

delete from man
where name in(
select name from man
except (
select min(name )
from man group by surname)
)


delete from a
from man a
inner join man b on a.surname = b.surame and a.name > b.name
15 окт 13, 15:53    [14973997]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
+100
Glory опять всех сделал
15 окт 13, 15:54    [14974015]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Glory
Member

Откуда:
Сообщений: 104751
Konst_One
+100
Glory опять всех сделал

При повторяющихся name этот вариант всех их оставит
15 окт 13, 15:55    [14974030]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ТС слишком много "если" за кадром оставил, согласен
15 окт 13, 15:57    [14974044]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Glory,

круто
15 окт 13, 16:13    [14974183]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Knyazev Alexey,
автор
а какой? "грязный"?

это будет на mysql и на оракле и на db2 работать?
15 окт 13, 16:14    [14974193]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Konst_One
declare @man table(name varchar(10), surname varchar(10))

insert into @man (name, surname)
select 'n1',      's1' union all 
select 'n2',      's1' union all 
select 'n3',      's3' union all
select 'n4',      's3' union all
select 'n5',      's2'

delete from @man
FROM @man B inner join (select surname, min(name) as name from @man group by surname) A
	ON B.name <> A.name And B.surname = A.surname

select * from @man


это уже PL ?
15 окт 13, 16:15    [14974200]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
redwhite90
Knyazev Alexey,
автор
а какой? "грязный"?

это будет на mysql и на оракле и на db2 работать?


а при чём тут эти продукты, если вы вопрос задаёте в тематическом форуме!?
15 окт 13, 16:16    [14974205]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Knyazev Alexey
redwhite90
Knyazev Alexey,
пропущено...

это будет на mysql и на оракле и на db2 работать?


а при чём тут эти продукты, если вы вопрос задаёте в тематическом форуме!?


просто интересуюсь
15 окт 13, 16:22    [14974261]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
okokok
Guest
Glory
Konst_One
+100
Glory опять всех сделал

При повторяющихся name этот вариант всех их оставит


redwhite90
таблица назывывается man(name - первичный ключ)
15 окт 13, 16:23    [14974281]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
okokok
Guest
redwhite90
это уже PL ?


нЭт. это T-SQL
15 окт 13, 16:26    [14974309]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
redwhite90
Member

Откуда:
Сообщений: 1907
Konst_One
declare @man table(name varchar(10), surname varchar(10))

insert into @man (name, surname)
select 'n1',      's1' union all 
select 'n2',      's1' union all 
select 'n3',      's3' union all
select 'n4',      's3' union all
select 'n5',      's2'

delete from @man
FROM @man B inner join (select surname, min(name) as name from @man group by surname) A
	ON B.name <> A.name And B.surname = A.surname

select * from @man

видимо на других бд это не сработает?
15 окт 13, 16:28    [14974326]     Ответить | Цитировать Сообщить модератору
 Re: Как написать такой запрос:  [new]
Гость333
Member

Откуда:
Сообщений: 3683
redwhite90
видимо на других бд это не сработает?

Синтаксис delete, в котором есть join'ы во from:
DELETE a
FROM a JOIN b ON ...
— это расширение T-SQL, отсутствующее в ANSI SQL. Поэтому не сработает.
15 окт 13, 16:33    [14974360]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить