Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на удаление дублирующих строк, При условии, равенства 2-х значений 
:(
    Опции темы
Softaz
Дата 4.3.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: нет
Всего: 16



Суть такая. Есть таблица сопоставлений двух других таблиц:
Код

id      cod_ent      cod_rubr
1      12               55               //все строки, в которых значения cod_ent и cod_rubr совпадают,
2      12               55               //удаляются, кроме одной.
3      12               55               //
4      23               32
5      11               22

Должно получится вот это:

id      cod_ent      cod_rubr
1      12               55               //одна строка осталась
4      23               32
5      11               22

GROUP BY почему-то не работает smile (возможно, мне неизвестны некоторые параметры использования).

Как сконструировать такой запрос?

Это сообщение отредактировал(а) Softaz - 4.3.2006, 10:34


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
Vas
Дата 4.3.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Вот так можно:
Код

DELETE FROM TABLE1 WHERE ID NOT IN
(select min(id) from TABLE1 group by cod_ent ,cod_rubr)

Добавлено @ 11:05
Цитата(Softaz @ 4.3.2006, 10:33 Найти цитируемый пост)
GROUP BY почему-то не работает smile (возможно, мне неизвестны некоторые параметры использования).

ID из запроса убери и будет GROUP BY нормально работать, он группирует одинаковые строки, а в твоем запросе они разные из-за ID.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
DimW
Дата 4.3.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



вот так можно удалить все строки которые дублируются:
Код

DELETE
FROM
 TEST_FORUM_T
WHERE CODE_ENT IN (SELECT DISTINCT
                   TFT.CODE_ENT
                  FROM
                   TEST_FORUM_T TFT
                  WHERE EXISTS (SELECT
                                 COUNT(*)
                                FROM
                                 TEST_FORUM_T TFT2
                                WHERE TFT2.CODE_ENT = TFT.CODE_ENT
                                GROUP BY
                                 TFT2.CODE_ENT
                                HAVING COUNT(*) > 1))

  AND CODE_RUBR IN (SELECT DISTINCT
                    TFT.CODE_RUBR
                   FROM
                    TEST_FORUM_T TFT
                   WHERE EXISTS (SELECT
                                  COUNT(*)
                                 FROM
                                  TEST_FORUM_T TFT2
                                 WHERE TFT2.CODE_RUBR = TFT.CODE_RUBR
                                 GROUP BY
                                  TFT2.CODE_RUBR
                                 HAVING COUNT(*) > 1))


но перед удалением строк, просто запомни ту строку которую нужно оставить и после удаления сделай инсерт этой строки.
да, СУБД указал бы хоть...

Это сообщение отредактировал(а) DimW - 4.3.2006, 11:56
PM MAIL ICQ   Вверх
Softaz
Дата 4.3.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: нет
Всего: 16



Vas
Спасибо. Работает.

DimW
СУБД -- ACCESS

но перед удалением строк, просто запомни ту строку которую нужно оставить и после удаления сделай инсерт этой строки.
Это уже "попахивает" циклами.
Таблица соответствий уже состоит из ~20000 записей и обещает расширяться.

Вопрос решен. Всем большое спасибо.


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
DimW
Дата 4.3.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



мда, тупонул.....
хорошая штука - автоинкремент!!! smile
Vas, респект!!! smile
PM MAIL ICQ   Вверх
AKN
Дата 15.3.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.11.2005

Репутация: нет
Всего: нет



Господа, проблема собственно схожая - нужно абдейдить записи поля, которые начинаются на "_[значение]" на просто "[значение]" - возможно это сделать средствами SQL или крутить в цикле. Таблица парадоксовская, записей около 3000. Спасибо
PM MAIL   Вверх
Softaz
Дата 18.3.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: нет
Всего: 16



AKN, используй регулярные выражения. Вот статья. Не помню, откуда взял, тк что привожу здесь.
3.3.4.7 Сравнение по шаблонам

В MySQL реализовано стандартное для SQL сравнение по шаблонам, а также особый тип такого сравнения - он основан на использовании выражений, подобных применяющимся в служебных программах Unix (таких, как vi, grep и sed).

В SQL при сравнении по шаблону символ `_' обозначает любой одиночный символ, а `%' - определенное количество символов (включая ноль символов). В MySQL в SQL-шаблонах по умолчанию не учитывается регистр символов. При работе с шаблонами SQL использование операторов = или <> не допускается, вместо этого применяются операторы сравнения LIKE или NOT LIKE.

Найти все имена, начинающиеся с `b', можно следующим образом:
Код

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

Найти все имена, заканчивающиеся на `fy', можно следующим образом:
Код

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

Найти все имена, содержащие `w', можно следующим образом:
Код

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

Найти все имена, содержащие ровно пять символов, можно при помощи шаблонного символа `_':
Код

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Во втором типе шаблонов, предусмотренных в MySQL, используются расширенные регулярные выражения. При поиске совпадений на основе такого шаблона шаблоном нужно пользоваться операторами REGEXP и NOT REGEXP (или их синонимами - RLIKE и NOT RLIKE).

Ниже приведены некоторые характеристики расширенных регулярных выражений:

`.' обозначает любой символ.
Класс символов `[...]' обозначает любой из символов в скобках. Например, `[abc]' обозначает `a', `b' или `c'. Набор символов можно обозначить с помощью дефиса. `[a-z]' обозначает любую букву нижнего регистра, а `[0-9]' - любую цифру.
`*' обозначает ноль или более экземпляров символа, стоящего перед ним. Например, `x*' обозначает любое количество символов `x', `[0-9]*' обозначает любое количество цифр, а `.*' - любое количество любых символов.
Для шаблона выдается совпадение, если поисковый контекст обнаружен в любой из частей значения, в котором производится поиск (для шаблонов SQL совпадение выдается только в случае, если совпадает все значение).
``Закрепить'' шаблон так, чтобы проверять совпадения с началом или концом значения можно с помощью символов `^' (начало) или `$' (конец), которые располагаются в начале или в конце шаблона соответственно.
Чтобы продемонстрировать работу регулярных выражений, приведенные выше запросы LIKE здесь переписаны с использованием REGEXP.

Найти все имена, начинающиеся с `b', можно при помощи символа `^', привязывающего шаблон к началу имени:
Код

mysql> SELECT * FROM pet WHERE name REGEXP "^b";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

В версиях MySQL до 3.23.4 REGEXP учитывает регистр символов, и приведенный запрос не возвратит никаких результатов. Для поиска символов `b' верхнего или нижнего регистра воспользуйтесь следующим запросом:
Код

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

Начиная с версии MySQL 3.23.4, заставить REGEXP учитывать регистр символов можно с помощью ключевого слова BINARY. В этом запросе положительный результат поиска будет получен только при обнаружении символа 'b' нижнего регистра в начале имени:
Код

mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";

Найти все имена, заканчивающиеся на `fy', можно при помощи символа `$', привязывающего шаблон к концу имени:
Код

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

Найти все имена, содержащие символ `w' любого регистра, можно так:
Код

mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

Поскольку регулярное выражение выдает положительный результат при совпадении шаблона с любым фрагментом значения, в приведенном выше примере привязывать поиск к любому из концов имени для сравнения полного значения с шаблоном, как это пришлось бы делать для шаблона SQL, не нужно.

Найти все имена, содержащие ровно пять символов, можно, если привязать поиск к началу и концу имени с помощью символов `^' и `$' и поставить пять символов `.' между ними:
Код

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

Предыдущий запрос можно записать и при помощи оператора `{n}' (``повторить-n-раз''):
Код

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+



Это сообщение отредактировал(а) Softaz - 18.3.2006, 20:26


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.