Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.06 c
14-1088115256
K.o.Z
2004-06-25 02:14
2004.07.11
Англия - Португалия


14-1087915090
Volk
2004-06-22 18:38
2004.07.11
Кто это делается?


14-1088090669
QuasiLamo
2004-06-24 19:24
2004.07.11
Oracle


1-1087979722
Aldor
2004-06-23 12:35
2004.07.11
103, 105 I/O error


14-1088052586
Lm
2004-06-24 08:49
2004.07.11
Материнская плата ASUS