Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
Корешь   (2006-02-16 10:19) [0]

Есть таблица вида
ID - первичный ключ
ID_LINE
TYPE_RECORD

как одним запросом получить уникальные TYPE_RECORD, Повторюсь уникальные, а не различные disctinct тут не подходит...


 
Vlad ©   (2006-02-16 10:42) [1]

Если я правильно понял, что-то вроде этого?

select * from table a where (1 = select count(*) from table b where a.TYPE_RECORD = b.TYPE_RECORD )


 
Johnmen ©   (2006-02-16 10:58) [2]

SELECT TYPE_RECORD FROM Table
GROUP BY TYPE_RECORD
HAVING COUNT(*)=1


 
Корешь   (2006-02-16 11:48) [3]

Вот полный текст запроса который у меня получился

SELECT
   ID,
   ID_ACCOUNT,
   ID_DOC,
   ID_DOC_LINE,
   OPER_DATE_TIME,
   "SUM",
   ANALYTIC_COMPLETION1,
   ANALYTIC_COMPLETION2,
   ANALYTIC_COMPLETION3,
   TYPE_TRAFFIC,
   (SELECT NUMBER_DOC FROM "DOC#BANCK_ORDERING_TAB3"
     WHERE ID ="REG#ACCOUNT_TRANS".ID_DOC_LINE) AS BANK_DOC_NUMBER,
   (SELECT DATE_DOC FROM "DOC#BANCK_ORDERING_TAB3"
     WHERE ID ="REG#ACCOUNT_TRANS".ID_DOC_LINE) AS BANK_DOC_DATE    
FROM
   "REG#ACCOUNT_TRANS"
WHERE
   ID_ACCOUNT = 20
GROUP BY ID_DOC_LINE
HAVING COUNT(*)=1


Грязно ругается: Invalid token.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).


 
ЮЮ ©   (2006-02-16 11:52) [4]

убери GROUP BY ID_DOC_LINE и расскажи,  что такое "уникальность", для которй Distinct не подходит


 
Johnmen ©   (2006-02-16 11:53) [5]

Срочно читать доки по SQL. В частности см. GROUP BY

Но, видимо, в твоём случае надо Vlad ©   (16.02.06 10:42) [1]
(не надо было вводить в заблуждение словами "получить уникальные TYPE_RECORD")


 
Корешь   (2006-02-16 12:08) [6]

Ни кого я в заблуждение не вводил в таблице записи в ID_DOC_LINE могут повторятся напримеер (таблицу сокращаю)
ID   ID_DOC_LINE  TYPE_TRAFFIC
1        1                  credit
2        1                  debit
3        2                  credit
4        3                  credit
5        3                  debit
6        4                  credit
7        4                  debit

Хочу чтоб запрос возвращал только запись с id 3


 
ЮЮ ©   (2006-02-16 12:15) [7]

а
 OPER_DATE_TIME,
  "SUM",
  ANALYTIC_COMPLETION1,
  ANALYTIC_COMPLETION2,
  ANALYTIC_COMPLETION3,
  TYPE_TRAFFIC
из какой записи получить хочешь, если их несколько?


 
Danilka ©   (2006-02-16 12:15) [8]

А по-русски написать не судьба? Например: "все записии таблицы, значение какого-то поля которой встречается только адын раз".

Под это определение попадает [1]. Вот еще вариант:

select * from "REG#ACCOUNT_TRANS" t1
where not exists (select 1 from "REG#ACCOUNT_TRANS" t2 where t1.ID_DOC_LINE = t2.ID_DOC_LINE and t1.id <> t2.id)


 
ЮЮ ©   (2006-02-16 12:19) [9]


> в ID_DOC_LINE могут повторятся


Или встречаться максимум только дважды, один раз с credit, а другой раз с debit ? (так, по-крайней мере в примере)


 
ЮЮ ©   (2006-02-16 12:53) [10]

Если действительно пофиг, что окажется в остальных полях, но важно, чтобы с определенным значением ID_DOC_LINE в итоговом запросе была только одна запись, то только так:

SELECT
  MAX(ac.ID) MaxId,
  MAX(ID_ACCOUNT) MaxAccount,
  MAX(ID_DOC) MaxDoc,
  ID_DOC_LINE,
  Max(OPER_DATE_TIME) MaxOperDate,
  Max("SUM") MaxSum,
  Max((ANALYTIC_COMPLETION1) MaxAC1,
  Max(ANALYTIC_COMPLETION2) MaxAC2,
  Max(ANALYTIC_COMPLETION3) MaxAC3,
  Max(TYPE_TRAFFIC) MaxYraffic,
  MAX(doclines.NUMBER_DOC) MaxNumberDoc,
  MAX(doclines.DATE_DOC ) MaxDateDoc

FROM
  "REG#ACCOUNT_TRANS" acc
  JOIN  "DOC#BANCK_ORDERING_TAB3" doclinesON doclines.Id = ID =acc.ID_DOC_LINE
WHERE
  ID_ACCOUNT = 20
GROUP BY acc.ID_DOC_LINE


 
sniknik ©   (2006-02-16 13:06) [11]

Корешь   (16.02.06 12:08) [6]

> ...
> Хочу чтоб запрос возвращал только запись с id 3
SELECT * FROM Table WHERE ID = 3

> Например: "все записии таблицы, значение какого-то поля которой встречается только адын раз".
SELECT * FROM Table
WHERE ID_DOC_LINE IN (
 SELECT ID_DOC_LINE FROM Table
 GROUP BY ID_DOC_LINE
 HAVING COUNT(*)=1)
если конечно синтаксис такой в FB пройдет (в общемто стандартный, должен)


 
Корешь   (2006-02-16 13:39) [12]

Вариант в 8 посте ни на что ни ругается и ни чего не возвращает, пробую остальные...


 
Корешь   (2006-02-16 14:17) [13]

Следующий запрос действительно возвращает записи в которых значение поля
A.ID_DOC_LINE встречается только один раз...Но если я добавлю еще условия (A.ID_ACCOUNT = 20) то запрос ни чего не возвращает, хотя записи удовлетворяющие данным условиям в таблице есть...
SELECT
   A.ID,
   A.ID_ACCOUNT,
   A.ID_DOC,
   A.ID_DOC_LINE,
   A.OPER_DATE_TIME,
   A."SUM",
   A.ANALYTIC_COMPLETION1,
   A.ANALYTIC_COMPLETION2,
   A.ANALYTIC_COMPLETION3,
   TYPE_TRAFFIC,
   (SELECT NUMBER_DOC FROM "DOC#BANCK_ORDERING_TAB3"
     WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_NUMBER,
   (SELECT DATE_DOC FROM "DOC#BANCK_ORDERING_TAB3"
     WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_DATE    
FROM
   "REG#ACCOUNT_TRANS" A
WHERE
   A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B GROUP BY B.ID_DOC_LINE HAVING COUNT(*)=1)


А этот вариант уже не работает
SELECT
   A.ID,
   A.ID_ACCOUNT,
   A.ID_DOC,
   A.ID_DOC_LINE,
   A.OPER_DATE_TIME,
   A."SUM",
   A.ANALYTIC_COMPLETION1,
   A.ANALYTIC_COMPLETION2,
   A.ANALYTIC_COMPLETION3,
   TYPE_TRAFFIC,
   (SELECT NUMBER_DOC FROM "DOC#BANCK_ORDERING_TAB3"
     WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_NUMBER,
   (SELECT DATE_DOC FROM "DOC#BANCK_ORDERING_TAB3"
     WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_DATE    
FROM
   "REG#ACCOUNT_TRANS" A
WHERE
   A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B GROUP BY B.ID_DOC_LINE HAVING COUNT(*)=1)
   AND A.ID_ACCOUNT = 20


 
Johnmen ©   (2006-02-16 14:40) [14]

"Нет - значит не было!" (c)


 
Корешь   (2006-02-16 14:51) [15]

Попробую прояснить ситуацию. Первоу словие надо отобрать все записи в которых ID_ACCOUNT = 20 из этих записей выбрать только те у в которых значение ID_DOC_LINE встречается только один раз. Видимо придется писать ХП или тащить на клиента все записи удовлетворяющие ID_ACCOUNT = 20 , отсортировать по полю ID_DOC_LINE  и в цикле выбирать те что встречаются один раз. Это решение мне не нравится но другого я пока не вижу. Ни у кого других идей нет?

"Нет - значит не было!" (c)
Действительно нет вед если следовать логике приведенного мной запроса первоначально отбираются все записи которые встречаются 1 раз и лишь затем проверяется условие ID_ACCOUNT = 20....


 
Vlad ©   (2006-02-16 15:37) [16]


> Корешь   (16.02.06 14:51) [15]

а ты [1] пробовал?
Только в условие where добавить a.ID_ACCOUNT = 20 and (... далее по тексту


 
Корешь   (2006-02-16 17:24) [17]


> а ты [1] пробовал?

Пробовал то же самое либо записи которые встречаются один раз в таблице (по полю ID_DOC_LINE ) либо ID_ACCOUNT = 20 :(


 
Johnmen ©   (2006-02-17 11:48) [18]

WHERE
  A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B WHERE B.ID_ACCOUNT = 20 GROUP BY B.ID_DOC_LINE HAVING COUNT(*)=1)


 
Корешь   (2006-02-17 14:32) [19]


> Johnmen ©

Проверил, возвращает все записи которые встречаются один раз при условие B.ID_ACCOUNT = 20 , и еще те же записи с другими значениями ID_ACCOUNT...


 
Корешь   (2006-02-17 14:37) [20]

WHERE
   A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B
      WHERE B.ID_ACCOUNT = 20 GROUP BY B.ID_DOC_LINE HAVING COUNT(B.ID_ACCOUNT)=1)
   AND A.ID_ACCOUNT = 20


Вот так вот работает так как надо
PLAN SORT ((B NATURAL)) PLAN (A NATURAL)


 
Корешь   (2006-02-17 14:38) [21]


> Johnmen ©  

Большое человеское спасибо:)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.014 c
2-1143485731
Handle
2006-03-27 22:55
2006.04.09
TListView


2-1142518530
Dust
2006-03-16 17:15
2006.04.09
комноненты Indi, что я делаю неправильно?


15-1141644636
X9
2006-03-06 14:30
2006.04.09
Новый проект


5-1129037812
Nik0
2005-10-11 17:36
2006.04.09
Нужна маска на ячейки стринггрида.


15-1142853447
Rentgen
2006-03-20 14:17
2006.04.09
для чего нужна ISaGRAF ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский