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

Вниз

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

 
Корешь   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
15-1142923918
Бугага
2006-03-21 09:51
2006.04.09
RFC заголовок


15-1142606592
DelphiLexx
2006-03-17 17:43
2006.04.09
Локализция языка программы написанной на Delphi


15-1142840700
Kuprin
2006-03-20 10:45
2006.04.09
Может кто сталкивался Ошибка DataBase Desktop


2-1143508187
Bratskiy
2006-03-28 05:09
2006.04.09
массив в переменной типа OleVariant


15-1142616914
Parus
2006-03-17 20:35
2006.04.09
Волшебство со сканером