Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2016, 12:06   #1
Roman Huskar
Новичок
Джуниор
 
Регистрация: 21.09.2016
Сообщений: 3
По умолчанию MS sql Удаление повторяющихся строк

Доброго дня.
Есть запрос.

create table #Test (t1 nvarchar(50), t2nvarchar(50))
insert into #Test
SELECT t1,t2
FROM DB
group by t1,t2
HAVING (COUNT(*) > 1)

Создается временная таблица для выборки повторяющихся значений по 2м полям (t1,t2).

Далее из основной таблицы Table делается выборка с присоединением #Test

select t0,t1,t2,t3,t4,t5

FROM Table
inner join
#Test on
Table.t1= #Test.t1
and Table.t2=#Test.t2

group by
t0,t1,t2,t3,t4,t5


order by Table.t1

В итоге получаю выборку по 2м повторяющимся полям с выводом из основной остальных полей.

Вопрос следующий: Как в получившейся выборке или таблице #Test убрать строки, повторяющиеся по полям t3,t4?

Спасибо.
Roman Huskar вне форума Ответить с цитированием
Старый 21.09.2016, 12:11   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
cтроки, повторяющиеся по полям t3,t4
при фиксированных t1,t2 или не зависимо от них?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.09.2016, 12:28   #3
Roman Huskar
Новичок
Джуниор
 
Регистрация: 21.09.2016
Сообщений: 3
По умолчанию

Таблица такая.
Иванов - такие строки мне нужны.
Петров. Сидоров - такие не нужны.

Если проще: ищу по совпадению t3,t4.
Если есть вывожу.
Но есть строки, где t1 и t2 совпадают - они не нужны.
По идее убрать дубли строк не по 2м полям t3,t4 а по 4м
Изображения
Тип файла: png 2016-09-21_12-26-29.png (5.3 Кб, 41 просмотров)
Тип файла: png 123.png (6.4 Кб, 37 просмотров)

Последний раз редактировалось Roman Huskar; 21.09.2016 в 12:32.
Roman Huskar вне форума Ответить с цитированием
Старый 21.09.2016, 12:51   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Если проще: ищу по совпадению t3,t4.
Если есть вывожу.
Следующий запрос найдет их
Код:
SELECT t3,t4 FROM DB group by t3,t4 HAVING COUNT(*) > 1
Цитата:
Но есть строки, где t1 и t2 совпадают - они не нужны.
Значит нужно их убрать:
Код:
SELECT X.t1,X.t2,X.t3,X.t4
  FROM DB X, (SELECT t3,t4 FROM DB group by t3,t4 HAVING COUNT(*) > 1) AS U
  WHERE X.t3=U.t3 AND X.t4=U.t4
  group by X.t1,X.t2,X.t3,X.t4
  HAVING COUNT(*) = 0
Ну и выбирай потом по совпадению t1, t2, t3, и t4 из основной таблицы. В общем-то и временных таблиц ни каких не надо
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.09.2016 в 12:55.
Аватар вне форума Ответить с цитированием
Старый 21.09.2016, 14:11   #5
Roman Huskar
Новичок
Джуниор
 
Регистрация: 21.09.2016
Сообщений: 3
По умолчанию

Всё бы ничего, но возникает ошибка:

Столбец OUSigning.ID недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

т.е. когда в1м select (SELECT X.t1,X.t2,X.t3,X.t4) я пытаюсь выбрать кроме 4х столбцов еще несколько - они должны быть указаны в group by.

В идеале такой запрос:

SELECT
X.t0
,X.t1
,X.t2
,X.t3
,X.t4
,X.t5
,X.t6
,X.t7
,X.t8

FROM DB X, (SELECT t3,t4 FROM DB group by t3,t4 HAVING COUNT(*) > 1) AS U
WHERE X.t3=U.t3 AND X.t4=U.t4
group by X.t3,X.t4
HAVING COUNT(*) = 0
Roman Huskar вне форума Ответить с цитированием
Старый 21.09.2016, 14:24   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ну и правильно ругается. Нужно сделать его вложенным:
Код:
SELECT Y.*
  FROM DB Y,
    (SELECT X.t1,X.t2,X.t3,X.t4
      FROM DB X, (SELECT t3,t4 FROM DB group by t3,t4 HAVING COUNT(*) > 1) AS U
      WHERE X.t3=U.t3 AND X.t4=U.t4
      group by X.t1,X.t2,X.t3,X.t4
      HAVING COUNT(*) = 1) AS T
  WHERE Y.t1=T.t1 AND Y.t2=T.t2 AND Y.t3=T.t3 AND Y.t4=T.t4
ЗЫ подправил: HAVING COUNT(*) = 1
было = 0
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.09.2016 в 15:38.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
МАКРОС НА ПОИСК, СУММИРОВАНИЕ И УДАЛЕНИЕ ПОВТОРЯЮЩИХСЯ СТРОК provodnikam Microsoft Office Excel 14 19.02.2015 07:53
Удаление повторяющихся строк из таблицы в SQL II_Dimit_II БД в Delphi 9 31.05.2013 02:48
удаление повторяющихся строк из другого файла ilbox Microsoft Office Excel 3 01.04.2012 17:48
Удаление пустых и повторяющихся строк Marsel737 Общие вопросы Delphi 5 03.12.2009 00:58
SQL-запрос на выбор повторяющихся строк stepchild БД в Delphi 2 07.06.2008 10:52