Форум: "Базы";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизВыбор уникальных полей Найти похожие ветки
← →
Piter © (2004-06-15 17:41) [0]В общем, есть поле N1 и есть поле N2.
Совместно они определяют уникальность записи. То есть, не бывает записей, чтобы и N1, и N2 совпадали. Могут совпадать N1, могут совпадать N2, но никак они вместе.
Так вот задача - выбрать все записи, у которых N1 и N2 разные (то есть, как раз выбрать уникальные записи).SELECT DISTINCT N1, N2 FROM MyTable
не катит. Так как надо вернуть все поля, а не только N1 и N2. В общем, задача простая, но я туплю...
← →
Sandman25 © (2004-06-15 17:46) [1]SELECT DISTINCT N1, N2 FROM MyTable
или
SELECT N1, N2 FROM MyTable
должны работать, причем одинаково, если (N1,N2) уникально
← →
Sandman25 © (2004-06-15 17:49) [2]n1 n2 n3
1 2 3
1 2 4
Что возвращать?
← →
sniknik © (2004-06-15 17:50) [3]GROUP BY N1, N2 катит, только надо решить что из остальных полей явно разномастных (раз их нельзя в выборку с дистинкт включить) выбирать.
← →
Johnmen © (2004-06-15 17:51) [4]>То есть, не бывает записей, чтобы и N1, и N2 совпадали.
и далее
>выбрать все записи, у которых N1 и N2 разные
:)))
Формулируй чётче...
← →
Piter © (2004-06-15 18:00) [5]Johnmen (15.06.04 17:51) [4]
БЛИН! Лоханулся... в общем, бывают записи с одинаковым N1 и N2!
И нужно
>выбрать все записи, у которых N1 и N2 разные
← →
Piter © (2004-06-15 18:03) [6]Sandman25 (15.06.04 17:49) [2]
n1 n2 n3
1 2 3
1 2 4
У записей, у которых N1 и N2 одинаковые - другие поля тоже одинаковые, кроме одного :))
В общем, чтобы не путаться - пофигу что возвращать, хоть n3=3, хоть n3=4, это неважно
← →
Johnmen © (2004-06-15 18:08) [7]Осталось огласить название сервера.
← →
Piter © (2004-06-15 18:10) [8]Johnmen (15.06.04 18:08) [7]
Firebird, если это важно...
← →
Vlad © (2004-06-15 18:20) [9]
> Piter © (15.06.04 18:10) [8]
> выбрать все записи, у которых N1 и N2 разные
так получается что тебе нужно выбрать записи у которых N1<>N2 ?
или же, подозреваю, нужно отсеять дублирующие записи, чтобы связка (N1+N2) стала уникальной ?
проясни, если не сложно.
← →
sniknik © (2004-06-15 18:23) [10]> Firebird, если это важно...
это вторая по важности вешь, после той что у тебя базы...
SELECT N1, N2, Min(N3), ... FROM MyTable
GROUP BY N1, N2
← →
Johnmen © (2004-06-15 18:29) [11]Примерно так
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)
← →
Johnmen © (2004-06-15 18:34) [12]Да, и главное ! Тщательно продумывать структуру таблиц БД ! Чтобы не было мучительно больно и т.д.
← →
Piter © (2004-06-15 18:40) [13]Vlad (15.06.04 18:20) [9]
или же, подозреваю, нужно отсеять дублирующие записи, чтобы связка (N1+N2) стала уникальной ?
ДА
← →
Piter © (2004-06-15 18:41) [14]Johnmen (15.06.04 18:29) [11]
RDB$DB_KEY
А что это такое - RDB$DB_KEY ?
У меня к тому же Firebird Embedded -там может не быть системных таблиц... если я вообще правильно понимаю...
← →
Piter © (2004-06-15 18:54) [15]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 19:03) [16]я понял... в примере:
sniknik (15.06.04 18:23) [10]
SELECT N1, N2, Min(N3), ... FROM MyTable
вместо троеточия нельзя ничего подставить больше :(... там везде должны быть агрегатные функции, а что делать если у меня строки?
← →
sniknik © (2004-06-15 19:29) [17]> вместо троеточия нельзя ничего подставить больше :(
можно, если выбереш что поставить, о чем и разговор, их же там несколько разных (все добавленное должно быть с агрегатами (выбор)).
> неужели в MSSQL было бы по другому оформлен такой простой запрос?
возможно. (есть варианты)
для аксесс меняем min, и работать будет гораздо быстрее
SELECT N1, N2, First(N3), ... FROM MyTable
GROUP BY N1, N2
← →
sniknik © (2004-06-15 19:33) [18]> а что делать если у меня строки?
а разве огненная птица не работает со строками в агрегатах? дятел влегкую... вот еще различие (если так).
Sum естественно не пойдет. ;о))
← →
Romkin © (2004-06-15 19:45) [19]Ну елки... http://www.ibase.ru/devinfo/deldupes.htm
зеленые :)))
>У меня к тому же Firebird Embedded -там может не быть системных таблиц... если я вообще правильно понимаю...
Угу. Почти. Этот сервер отличается от нормального только тем, что в реестр не смотрит, и допускает только одно соединение к БД. больше различий нет Компилят-то с одного исходника
← →
Piter © (2004-06-15 19:53) [20]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] - что там хоть делается то? :)
← →
Johnmen © (2004-06-15 21:35) [21]>что там хоть делается то?
Там всё просто.
1. Если у тебя нет (а это так, и в этом большой просчёт) признака уникальности записи, то будем использовать в его качестве "указатель" на расположение записи в БД. Это RDB$DB_KEY.
2. Из совокупности "одинаковых" записей берём одну, первую (т.к. тебе всё равно, какую, как ты сказал). Она и попадет в результирующий НД.
>...там нету ни одной системной таблицы..
Откуда такие сведения ? :)))
Всё-таки рекомендую почитать общую теорию построения баз данных...
← →
Piter © (2004-06-15 22:51) [22]Johnmen (15.06.04 21:35) [21]
>...там нету ни одной системной таблицы..
Откуда такие сведения ? :)))
ну... элементарная логика... в Firebird, например, есть файл isc4.gdb, где и хранятся системные таблицы.
А в FB EMB это где?! Нету же такого файла!
← →
Romkin © (2004-06-15 23:52) [23]Элементарная логика подсказывает, что вся БД содержится в одном файле :)))
А в isc4 - логины, имена и пароли пользователей для входа на сервер...
Все-таки, как насчет теории реляционных БД?
И как насчет попробовать, проверить, а не говорить глупости?
← →
Piter © (2004-06-16 14:35) [24]Romkin (15.06.04 23:52) [23]
Элементарная логика подсказывает, что вся БД содержится в одном файле
Да? Ну например... например, список индексов? Да, индексы хранятся в файле с базой... но список индексов? Вот ты можешь определить какие поля проиндексированы, если у тебя будет только файл gdb с базой?
Romkin (15.06.04 23:52) [23]
А в isc4 - логины, имена и пароли пользователей для входа на сервер...
вот именно. Как минимум еще в EMB нету аутентификации, а не только
>Этот сервер отличается от нормального только тем, что в реестр не смотрит, и допускает только одно соединение к БД. больше различий нет
← →
Romkin © (2004-06-16 14:40) [25]Piter © (16.06.04 14:35) [24] А инструкцию почитать? Select * from rdb$indices
Select * from rdb$index_segments
И идентификация пользователя есть, просто пароль не проверяется. А права будут для того, под кем вошел
← →
Johnmen © (2004-06-16 14:41) [26]>Piter © (16.06.04 14:35) [24]
Спорить не обладая информацией и знанием по меньшей мере неумно.
Вся исчерпывающая информация о БД лежит в её системных таблицах.
(за искл. некоторых специфических вещей)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.031 c