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

Откуда:
Сообщений: 626
Таблица:
Select ID, a,b,c,d,e 
from tt


Как вывести все записи, у которых есть дубли?
Критерий дубля: если в таблице существует такая же запись, у которой поля a,b,c,d совпадают.

И второй вопрос:
Как вывести все записи, у которых есть более одного дубля? (т.е. у записи есть два и более клонов по вышеупомянутому критерию).
18 авг 15, 14:09    [18033936]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
group by ... having count()>1
18 авг 15, 14:10    [18033945]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
SELECT * FROM 
(
	Select ID, 
		CC = COUNT(*) OVER (PARTITION BY a,b,c,d),
		a,b,c,d,
		e 
	from 
	(
		SELECT 1 ID, 1 a, 1 b,1 c,1 d,1 e  UNION ALL
		SELECT 2 ID, 1 a, 1 b,1 c,1 d,2 e  UNION ALL 
		SELECT 3 ID, 1 a, 1 b,1 c,1 d,3 e  UNION ALL
		SELECT 4 ID, 2 a, 1 b,1 c,1 d,1 e  UNION ALL
		SELECT 5 ID, 3 a, 1 b,1 c,1 d,2 e  UNION ALL
		SELECT 6 ID, 2 a, 1 b,1 c,1 d,1 e  UNION ALL
		SELECT 7 ID, 3 a, 1 b,1 c,1 d,2 e  UNION ALL
		SELECT 8 ID, 4 a, 1 b,1 c,1 d,4 e  
	) tt 
) TTT
WHERE CC > 1 
18 авг 15, 14:15    [18033987]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Konst_One
group by ... having count()>1


"вывести все записи, у которых есть более одного дубля" так не делается
18 авг 15, 14:15    [18033998]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
это почему?
18 авг 15, 14:16    [18034003]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Konst_One
это почему?


Потому что нужны исходные записи, а не результат их группировки. Или выдайте в студию полный запрос, а то может я не понял, что вы такое хитрое имеете ввиду
18 авг 15, 14:20    [18034036]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
a_voronin
что нужны исходные записи


я такого в вопросе не заметил. в любом случае ТС получил варианты, пусть решает, что ему нужно
18 авг 15, 14:21    [18034045]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE @tt TABLE(ID int, a int,b int,c int,d int,e int);
INSERT @tt(ID,a,b,c,d,e)VALUES
 (1,2,2,5,NULL,23)
,(2,0,1,2,3,4)
,(3,8,2,5,NULL,NULL)
,(4,2,2,5,NULL,100)
,(6,2,2,5,NULL,90)
,(7,0,1,2,3,0);

/*1*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d));

/*2*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d) HAVING COUNT(*)>1);
18 авг 15, 14:21    [18034054]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Konst_One
a_voronin
что нужны исходные записи


я такого в вопросе не заметил. в любом случае ТС получил варианты, пусть решает, что ему нужно


Цитирую ТС
"вывести все записи, у которых есть более одного дубля"
18 авг 15, 14:22    [18034065]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
a_voronin
все записи


ну и что? они и будут все записи, которые имеют дубли. дубли не просили выводить, нет, тогда какие претензии?
нечёткая формулировка задачи ТС без соблюдения праваил форума - вот и результат неверного понимания
18 авг 15, 14:25    [18034098]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
iap
DECLARE @tt TABLE(ID int, a int,b int,c int,d int,e int);
INSERT @tt(ID,a,b,c,d,e)VALUES
 (1,2,2,5,NULL,23)
,(2,0,1,2,3,4)
,(3,8,2,5,NULL,NULL)
,(4,2,2,5,NULL,100)
,(6,2,2,5,NULL,90)
,(7,0,1,2,3,0);

/*1*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d));

/*2*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d) HAVING COUNT(*)>1);


Нумер 1 Ок. Нумер 2 не даёт нужного результата.
18 авг 15, 14:25    [18034101]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a_voronin
Нумер 2 не даёт нужного результата.
Почему это?
Разве он не отбрасывает дубликаты, если их меньше 2 (с оригиналом < 3)?
18 авг 15, 14:27    [18034121]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
a_voronin
Нумер 2 не даёт нужного результата.
Почему это?
Разве он не отбрасывает дубликаты, если их меньше 2 (с оригиналом < 3)?
Красивее, конечно, во втором запросе выбросить tt.ID<>t.ID, а COUNT(*) сравнивать с 2.
С другой стороны так наглядно видно чем они отличаются.
18 авг 15, 14:31    [18034151]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Картинка с другого сайта.
18 авг 15, 14:33    [18034172]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
o-o
Guest
хорошо вас девица развела,
запрос-то элементарный, но стОило хитреньким обозвать, a_voronin-а аж на художества пробило
P.S. к картинке еще надо подпись сделать: "идет массовый поиск дублей"
18 авг 15, 14:43    [18034231]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
хорошо вас девица развела,
запрос-то элементарный, но стОило хитреньким обозвать, a_voronin-а аж на художества пробило
P.S. к картинке еще надо подпись сделать: "идет массовый поиск дублей"


Девушка эта между прочим SCOPE-ы в кубах сумела постигнуть. А вы тут на постановке задаче зациклились.
18 авг 15, 14:49    [18034290]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
хорошо вас девица развела,
запрос-то элементарный, но стОило хитреньким обозвать, a_voronin-а аж на художества пробило
P.S. к картинке еще надо подпись сделать: "идет массовый поиск дублей"


Лучше "дерево решений для дерева поставленных задач по поиску дублирующихся деревьев в клонированном лесу на реплицированном множестве лесных массивов"
18 авг 15, 14:55    [18034349]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
o-o
Guest
a_voronin
o-o
хорошо вас девица развела,
запрос-то элементарный, но стОило хитреньким обозвать, a_voronin-а аж на художества пробило
P.S. к картинке еще надо подпись сделать: "идет массовый поиск дублей"


Девушка эта между прочим SCOPE-ы в кубах сумела постигнуть. А вы тут на постановке задаче зациклились.

я разве что-то против нее имею?
могу еще и идею подкинуть:
организуйте уже по этому случаю доску почета с выдачей поощрений

Картинка с другого сайта.
18 авг 15, 15:00    [18034387]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
+ гы
интересно только я один решил слазить на "простой.ру" что бы посмотреть что там?
18 авг 15, 15:06    [18034431]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
Nika gnome
Member

Откуда:
Сообщений: 626
Konst_One
a_voronin
все записи


ну и что? они и будут все записи, которые имеют дубли. дубли не просили выводить, нет, тогда какие претензии?
нечёткая формулировка задачи ТС без соблюдения праваил форума - вот и результат неверного понимания

дубли, блин, тоже являются записями. Нужно вывести все записи. Вот же ж упёрся-то..
18 авг 15, 16:19    [18034929]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
Nika gnome
Member

Откуда:
Сообщений: 626
iap
DECLARE @tt TABLE(ID int, a int,b int,c int,d int,e int);
INSERT @tt(ID,a,b,c,d,e)VALUES
 (1,2,2,5,NULL,23)
,(2,0,1,2,3,4)
,(3,8,2,5,NULL,NULL)
,(4,2,2,5,NULL,100)
,(6,2,2,5,NULL,90)
,(7,0,1,2,3,0);

/*1*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d));

/*2*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d) HAVING COUNT(*)>1);


о, а мне нравится!!!)) оказывается, плохо SQL знаю, видели бы вы, что я тут нагородила.... Про Intersect я не подумала ^_^
18 авг 15, 16:23    [18034969]     Ответить | Цитировать Сообщить модератору
 Re: Составить хитренький запрос, каково ваше решение?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Nika gnome
iap
DECLARE @tt TABLE(ID int, a int,b int,c int,d int,e int);
INSERT @tt(ID,a,b,c,d,e)VALUES
 (1,2,2,5,NULL,23)
,(2,0,1,2,3,4)
,(3,8,2,5,NULL,NULL)
,(4,2,2,5,NULL,100)
,(6,2,2,5,NULL,90)
,(7,0,1,2,3,0);

/*1*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d));

/*2*/
SELECT *
FROM @tt t
WHERE EXISTS(SELECT * FROM @tt tt WHERE tt.ID<>t.ID AND EXISTS(SELECT t.a,t.b,t.c,t.d INTERSECT SELECT tt.a,tt.b,tt.c,tt.d) HAVING COUNT(*)>1);



о, а мне нравится!!!)) оказывается, плохо SQL знаю, видели бы вы, что я тут нагородила.... Про Intersect я не подумала ^_^
INTERSECT только для краткости сравнения со значением NULL.
Иначе придётся длинную простыню писать. Правда, работало бы быстрее.
18 авг 15, 16:26    [18034993]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить