Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выбор уникальных полей


Страницы:   1 2

Piter ©   (2004-06-15 17:41:00) 

В общем, есть поле N1 и есть поле N2.

Совместно они определяют уникальность записи. То есть, не бывает записей, чтобы и N1, и N2 совпадали. Могут совпадать N1, могут совпадать N2, но никак они вместе.

Так вот задача - выбрать все записи, у которых N1 и N2 разные (то есть, как раз выбрать уникальные записи).

SELECT DISTINCT N1, N2 FROM MyTable

не катит. Так как надо вернуть все поля, а не только N1 и N2. В общем, задача простая, но я туплю...


Johnmen   (2004-06-16 14:41:00) [1]

>Piter ©   (16.06.04 14:35) [24]

Спорить не обладая информацией и знанием по меньшей мере неумно.
Вся исчерпывающая информация о БД лежит в её системных таблицах.
(за искл. некоторых специфических вещей)


Romkin   (2004-06-16 14:40:00) [2]

Piter ©  (16.06.04 14:35) [24] А инструкцию почитать? Select * from rdb$indices
Select * from rdb$index_segments
И идентификация пользователя есть, просто пароль не проверяется. А права будут для того, под кем вошел


Piter   (2004-06-16 14:35:00) [3]

Romkin (15.06.04 23:52) [23]
Элементарная логика подсказывает, что вся БД содержится в одном файле


Да? Ну например... например, список индексов? Да, индексы хранятся в файле с базой... но список индексов? Вот ты можешь определить какие поля проиндексированы, если у тебя будет только файл gdb с базой?

Romkin (15.06.04 23:52) [23]
А в isc4 - логины, имена и пароли пользователей для входа на сервер...


вот именно. Как минимум еще в EMB нету аутентификации, а не только
>Этот сервер отличается от нормального только тем, что в реестр не смотрит, и допускает только одно соединение к БД. больше различий нет


Romkin   (2004-06-15 23:52:00) [4]

Элементарная логика подсказывает, что вся БД содержится в одном файле :)))
А в isc4 - логины, имена и пароли пользователей для входа на сервер...
Все-таки, как насчет теории реляционных БД?
И как насчет попробовать, проверить, а не говорить глупости?


Piter   (2004-06-15 22:51:00) [5]

Johnmen (15.06.04 21:35) [21]
>...там нету ни одной системной таблицы..
Откуда такие сведения ? :)))


ну... элементарная логика... в Firebird, например, есть файл isc4.gdb, где и хранятся системные таблицы.
А в FB EMB это где?! Нету же такого файла!


Johnmen   (2004-06-15 21:35:00) [6]

>что там хоть делается то?

Там всё просто.
1. Если у тебя нет (а это так, и в этом большой просчёт) признака уникальности записи, то будем использовать в его качестве "указатель" на расположение записи в БД. Это RDB$DB_KEY.
2. Из совокупности "одинаковых" записей берём одну, первую (т.к. тебе всё равно, какую, как ты сказал). Она и попадет в результирующий НД.

>...там нету ни одной системной таблицы..

Откуда такие сведения ? :)))
Всё-таки рекомендую почитать общую теорию построения баз данных...


Piter   (2004-06-15 19:53:00) [7]

Romkin (15.06.04 19:45) [19]
больше различий нет


ну конечно...
Как минимум, в FB EMB нету аутентификации, там нету ни одной системной таблицы... разве это не различие?

sniknik (15.06.04 19:33) [18]
а разве огненная птица не работает со строками в агрегатах?


да вроде работает... только как-то некрасиво так писать:

Max(n3), Max(n4), Max(n5) и т.д.

неужели нельзя как-то покрасивее?

И еще никак не могу вникнуть в код Johnmen ©   (15.06.04 18:29) [11] - что там хоть делается то? :)


Romkin   (2004-06-15 19:45:00) [8]

Ну елки... http://www.ibase.ru/devinfo/deldupes.htm
зеленые :)))
>У меня к тому же Firebird Embedded -там может не быть системных таблиц... если я вообще правильно понимаю...
Угу. Почти. Этот сервер отличается от нормального только тем, что в реестр не смотрит, и допускает только одно соединение к БД. больше различий нет Компилят-то с одного исходника


sniknik   (2004-06-15 19:33:00) [9]

> а что делать если у меня строки?
а разве огненная птица не работает со строками в агрегатах? дятел влегкую... вот еще различие (если так).
Sum естественно не пойдет. ;о))


sniknik   (2004-06-15 19:29:00) [10]

> вместо троеточия нельзя ничего подставить больше :(
можно, если выбереш что поставить, о чем и разговор, их же там несколько разных (все добавленное должно быть с агрегатами (выбор)).

> неужели в MSSQL было бы по другому оформлен такой простой запрос?
возможно. (есть варианты)
для аксесс меняем min, и работать будет гораздо быстрее
SELECT N1, N2, First(N3), ...  FROM MyTable
GROUP BY N1, N2


Piter   (2004-06-15 19:03:00) [11]

я понял... в примере:

sniknik (15.06.04 18:23) [10]
SELECT N1, N2, Min(N3), ...  FROM MyTable


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


Piter   (2004-06-15 18:54:00) [12]

sniknik (15.06.04 18:23) [10]
SELECT N1, N2, Min(N3), ...  FROM MyTable
GROUP BY N1, N2


Пишет:
Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)


sniknik (15.06.04 18:23) [10]
это вторая по важности вешь, после той что у тебя базы...


неужели в MSSQL было бы по другому оформлен такой простой запрос?


Piter   (2004-06-15 18:41:00) [13]

Johnmen (15.06.04 18:29) [11]
RDB$DB_KEY


А что это такое - RDB$DB_KEY ?

У меня к тому же Firebird Embedded -там может не быть системных таблиц... если я вообще правильно понимаю...


Piter   (2004-06-15 18:40:00) [14]

Vlad (15.06.04 18:20) [9]
или же, подозреваю, нужно отсеять дублирующие записи, чтобы связка (N1+N2) стала уникальной ?


ДА


Johnmen   (2004-06-15 18:34:00) [15]

Да, и главное ! Тщательно продумывать структуру таблиц БД ! Чтобы не было мучительно больно и т.д.


Johnmen   (2004-06-15 18:29:00) [16]

Примерно так
SELECT * FROM MyTable T1
WHERE T1.RDB$DB_KEY =
 (SELECT FIRST 1 T2.RDB$DB_KEY
  FROM MyTable T2
  WHERE T2.N1=T1.N1 AND T2.N2=T1.N2 AND T2.N1<>T2.N2)


sniknik   (2004-06-15 18:23:00) [17]

> Firebird, если это важно...
это вторая по важности вешь, после той что у тебя базы...

SELECT N1, N2, Min(N3), ...  FROM MyTable
GROUP BY N1, N2


Vlad   (2004-06-15 18:20:00) [18]


> Piter ©   (15.06.04 18:10) [8]


> выбрать все записи, у которых N1 и N2 разные

так получается что тебе нужно выбрать записи у которых N1<>N2 ?

или же, подозреваю, нужно отсеять дублирующие записи, чтобы связка (N1+N2) стала уникальной ?

проясни, если не сложно.


Piter   (2004-06-15 18:10:00) [19]

Johnmen (15.06.04 18:08) [7]

Firebird, если это важно...


Johnmen   (2004-06-15 18:08:00) [20]

Осталось огласить название сервера.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо