Текущий архив: 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.5 MB
Время: 0.015 c