![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выбор уникальных полей
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]Осталось огласить название сервера.