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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2010, 04:58   #1
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию Проверка на уникальность трёх полей

Здравствуйте.

Возникла следующая проблема, есть БД, в ней, конечно же, имеется ключевое поле, однако, в своей задаче я его не использую.

Меня уверили, что каждую строку полностью и однозначно определяют три (других) поля, т.е., по сути их можно было бы взять за ключевые. Необходимо проверить, так ли это, т.е. написать запрос, который работал бы примерно так:

Num Name...... Obozn GOST .......Primechanie
01.... Реле...... ...А01 gost_5 .......qqwerqwr
02.... Резистор ...H65 gost_4 .......dfdsa
03.... Реле...... ...А55 gost_5 .......Прим
04.... Реле...... ...А01 gost_5 .......Прим
05.... Резистор ...H67 gost_4 .......dfdsa
06.... Резистор ...H67 gost_4 .......dfdsa
07.... Резистор ...H23 gost_4 .......dfdsa
...

Выдал строки
01.... Реле...... ...А01 gost_5 .......qqwerqwr
04.... Реле...... ...А01 gost_5 .......Прим
и
05.... Резистор ...H67 gost_4 .......dfdsa
06.... Резистор ...H67 gost_4 .......dfdsa

т.к. в них значения в тех трёх полях (Name, Obozn, GOST) совпадают.

Можно ли это сделать средствами SQL ?

Последний раз редактировалось AnTe; 06.09.2010 в 05:06.
AnTe вне форума Ответить с цитированием
Старый 06.09.2010, 08:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

да, можно. и даже несложно.
Вот так:
Код:
SELECT Name, Obozn, GOST, count(*) as CntPovtor
  FROM YourTable
  GROUP BY Name, Obozn, GOST
  HAVING count(*)>1
только Вы получите вот такой результат
Цитата:
Реле...... ...А01 gost_5 2
Резистор ...H67 gost_4 2
в последнем столбце количество повторов.
Но, при необходимости можно получить и в том виде, в каком Вы написали.. Надо? Тогда укажите, для какой СУБД нужен запрос.

p.s. Чтобы набор полей был уникальным в нормальной СУБД можно (и достаточно) создать уникальный индекс по трём полям. Тогда добавить повтор будет физически невозможно.

p.p.s. Упаси Вас Боже использовать естественные ключи в качестве первичного (составного) ключа к таблице. Почитайте на досуге Анатолий Тенцер, Естественные ключи против искуственных ключей

Последний раз редактировалось Serge_Bliznykov; 06.09.2010 в 08:16.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2010, 08:35   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А сделать уникальный индекс?
Тогда и проверять не придется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.09.2010, 10:25   #4
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Спасибо!
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да, можно. и даже несложно.
Вот так:

SELECT Name, Obozn, GOST, count(*) as CntPovtor...
А что такое CntPovtor? в двух словах, если можно. В sql я полный ноль.
upd: похоже, разобрался: HAVING count(*)>1 нужно заменить на HAVING CntPovtor > 1 ?
сейчас попробую...

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

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.p.s. Упаси Вас Боже использовать естественные ключи в качестве первичного (составного) ключа к таблице. Почитайте на досуге Анатолий Тенцер, Естественные ключи против искуственных ключей
Спасибо ещё раз, очень интересная статья. Нутром чуял, что так и надо, но сомневался... Теперь все точки над i расставлены!

Последний раз редактировалось AnTe; 06.09.2010 в 10:33.
AnTe вне форума Ответить с цитированием
Старый 06.09.2010, 11:04   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
А что такое CntPovtor? в двух словах, если можно. В sql я полный ноль.
Ну, это не оправдание. Во-первых, это не так сложно. А во-вторых, литературы (простой и понятной) достаточно много.
А, например, рекомендую начать с Мартина Грубера "Понимание SQL"
В-третьих, применение SQL это почти всегда самое эффективное и надёжное решение (его для того и придумали).

теперь по сути вопроса - запрос делится на функциональные части. В части SELECT указываются выбираемое (это поля/функции/подзапросы и т.д.). При этом для выбираемых значений можно задать имя (алиас)
например select Name as TheNameofElectricalDevice from ....
в результате запроса будет поле с именем TheNameofElectricalDevice

в моём случае я для результата агрегатной функции count(*) задал имя (это может быть любой идентификатор). Это сделано исключительно для удобства/наглядности.

Цитата:
upd: похоже, разобрался: HAVING count(*)>1 нужно заменить на HAVING CntPovtor > 1 ?
сейчас попробую...
насколько я понимаю, как раз заменить так нельзя!
Запрос нужно было использовать прямо так, как я написал.
Попробуйте. Если будут проблемы - обращайтесь, разберёмся совместно.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверка полей TextBox Ilya_L Microsoft Office Excel 3 22.06.2010 02:44
Access + ADO, проверка ключа на уникальность KiLLiR БД в Delphi 2 23.02.2009 10:36
проверка полей формы AIst PHP 3 10.09.2008 02:59
Уникальность индекса в БД spiteful41 Помощь студентам 7 27.05.2008 01:26
Уникальность по 3 полям num8er БД в Delphi 3 09.10.2007 09:54